在这种情况下如何更改二维列表中的元素

How to Change Element in 2d list in this case

在此, 我想更改第二个嵌套列表的第一个元素但是。

L1=list('|  |')
L2=[L1,L1]
print L2

>>>[ [ '|', ' ', ' ', '|' ], [ '|', ' ', ' ', '|' ] ]

L2[1][0]='@'
print L2

>>>[ [ '@', ' ', ' ', '|' ], [ '@', ' ', ' ', '|' ] ]

它改变了两个嵌套列表!! 我哪里错了??

问题是这样的:

L1 = list('|  |')
L2 = [L1, L1]

for item in L2:
    print(id(item))  # -> twice the same id.

您构建了一个新列表,其中包含对 相同 列表的两个引用。对此列表的更改将反映在 L2.

的两项中

您可能想要做的是:

L2 = [list('|  |'), list('|  |')]

现在

L2[1][0]='@'

按预期工作。

我假设你的第二行是

L2 = [L1, L1]

通过这样做,您不会将 L1 值传递给 L2,而是引用两次。他们指向同一个地方。 id(L2[0][0])id(L2[1][0]) 会给你同样的结果。

另一种选择

import copy
L2 = [L1, copy.copy(L1)]

当您创建一个包含两个相同列表的列表时,您并不是在创建两个独立的子列表,而是在创建一个引用内存中相同列表的列表。因此,改变一个,改变另一个:

In [18]: L1=list('|  |')

In [19]: id(L1)
Out[19]: 4388545160

In [20]: L2 = [L1, L1]

In [21]: id(L2)
Out[21]: 4389336520

In [22]: for sub in L2: print(id(sub))
4388545160
4388545160

您的项目重新分配是就地操作,它会更改内存中的子列表,而不会将其重新分配给其他内容。这导致你的行为

您可以使用列表切片来处理原始列表的副本,而不是使用第二个列表中的原始列表。查看以下示例以了解更多详细信息:

没有列表切片:

>>> l1 = ['a', 'b']
>>> l2 = [l1, l1]
>>>
>>> l2[1][0] = 'x'
>>> l2
[['x', 'b'], ['x', 'b']] # both sub-lists are changed

现在,使用列表切片:

>>> l3 = ['a', 'b']
>>> l4 = [l3[:], l3[:]]
>>>
>>> l4[1][0] = 'x'
>>> l4
[['a', 'b'], ['x', 'b']]  # only the second sub-list is changed