2

这是我正在尝试做的 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]]]

这就是我真正的目标。我究竟做错了什么?

4

1 回答 1

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]]
于 2013-06-27T17:33:48.753 回答