这是我正在尝试做的MWE:
lis = []
# Initialize empty list
for i in range(2):
lis.append([[0]]*2)
# First print
print lis
# Second print
print lis[0][1][0]
# Modify item
lis[0][1][0] += 1
# Third print
print lis
第一个 print
将列表作为[[[0], [0]], [[0], [0]]]
返回,这是正确的,我有一个由多个列表组成的第一个列表,每个列表也由多个列表组成(我需要这个嵌套列表来做我正在做的事情。 第二个 print
将索引0和1中的项目返回为0
,这也是正确的。但第三 print
向我显示新列表:
[[[1], [1]], [[0], [0]]]
而不是:
[[[0], [1]], [[0], [0]]]
这就是我的目标。我做错了什么?
答案 0 :(得分:7)
这种情况正在发生,因为两个内部列表实际上都是同一个对象的副本,所以修改一个也会影响另一个。
>>> l = [[0]]*2
>>> [id(x) for x in l]
[145328716, 145328716] #same IDs
>>> l[0].append(4)
>>> l
[[0, 4], [0, 4]]
使用列表推导来避免这种情况:
>>> l = [[0] for _ in xrange(2)]
>>> [id(x) for x in l] #Different IDs
[145327372, 145327500]
>>> l[0].append(4)
>>> l
[[0, 4], [0]]