在此, 我想改变第二个嵌套列表的第一个元素,但是。
L1=list('| |')
L2=[L1,L1]
print L2
>>>[ [ '|', ' ', ' ', '|' ], [ '|', ' ', ' ', '|' ] ]
L2[1][0]='@'
print L2
>>>[ [ '@', ' ', ' ', '|' ], [ '@', ' ', ' ', '|' ] ]
它改变了嵌套列表!! 我错的地方?
答案 0 :(得分:2)
我假设你的第二行是
L2 = [L1, L1]
通过执行此操作,您不会将L1值传递给L2,而是传递两次。他们指向同一个地方。 id(L2[0][0])
和id(L2[1][0])
会给你一样的。
替代
import copy
L2 = [L1, copy.copy(L1)]
答案 1 :(得分:0)
问题是:
L1 = list('| |')
L2 = [L1, L1]
for item in L2:
print(id(item)) # -> twice the same id.
您构建一个新列表,其中包含对相同列表的两个引用。对此列表的更改将反映在L2
的两个项目中。
您可能想要做的是:
L2 = [list('| |'), list('| |')]
现在
L2[1][0]='@'
按预期工作。
答案 2 :(得分:0)
当您在其中创建包含两个相同列表的列表时,您不会创建两个独立的子列表 - 而是创建一个列表,其中包含对内存中相同列表的引用。因此,改变一个,改变另一个:
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
您的项目重新分配是一个就地操作,它会更改内存中的子列表,而不会将其重新分配给其他内容。这会导致您的行为
答案 3 :(得分:0)
您可以使用列表切片来处理原始列表的副本,而不是使用第二个列表中的原始列表。请查看以下示例以获取更多详细信息:
没有列表切片:
>>> 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