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