制作一份清单副本

时间:2015-03-16 23:48:41

标签: python

我正在尝试制作一个“目标”,一个“网格”的副本。我不明白为什么这段代码不起作用。

grid = [[randint(0, 1), randint(0, 1), randint(0, 1)],
        [randint(0, 1), randint(0, 1), randint(0, 1)],
        [randint(0, 1), randint(0, 1), randint(0, 1)]]

target = [[0, 0, 0]] * 3
for x in range(3):
    for y in range(3):
        target[x][y] = grid[x][y]

print target
print grid

结果如下:

[[0, 1, 0], [0, 1, 0], [0, 1, 0]]
[[1, 0, 0], [0, 1, 1], [0, 1, 0]]

1 个答案:

答案 0 :(得分:5)

这部分:

target = [[0, 0, 0]] * 3

创建一个重复3次相同列表的列表。因此,对一个项目的更改实际上反映在所有项目中(它们是相同的对象)。你想要的是三次创建一个列表:

target = [[0, 0, 0] for _ in range(3)]

您应该只使用列表(或列表乘法)上的星号运算符与immutable个对象(如果有的话),这些对象没有此问题,因为您无法更改其状态。

不要忘记您可以使用(x[:]用于创建名为x的列表的副本,就像list(x)一样):< / p>

grid = [x[:] for x in target]

或更常见的是使用copy.deepcopy

from copy import deepcopy
grid = deepcopy(target)