复制清单 - 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]]

python大神给出的解决方案

这部分:

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

创建一个列表,该列表重复3次。因此,对一项的更改实际上反映了所有内容(它们是同一对象)。您想要创建三个列表:

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

您仅应将列表(或列表乘法)上的star运算符与immutable对象一起使用(如果有的话),这不会出现此问题,因为您无法更改其状态。

别忘了可以使用(x[:]用于创建名为x的列表的浅表副本,就像list(x)一样):

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

甚至更普遍地使用copy.deepcopy:

from copy import deepcopy
grid = deepcopy(target)