我正在尝试创建“目标”,即“网格”的副本。我不明白为什么这段代码不起作用。
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)