当我更改嵌套列表grid
中的值时,我注意到了一种奇怪的行为,该列表已初始化为grid = [[0]*10]*10
。
grid = [[0]*10]*10
grid[0][0] = 1
for l in grid:
print l
输出:
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
当我将grid
初始化为grid = [[0]*10 for x in range(10)]
时。
它按预期工作。
grid = [[0]*10 for x in range(10)]
grid[0][0] = 1
for l in grid:
print l
输出:
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
有谁知道为什么会这样?
感谢您的帮助!
答案 0 :(得分:2)
创建grid = [[0]*10]*10
时,实际上是在创建一个对同一个对象([0] s列表)的引用数组。因此,当您通过一个引用更改对象时,这将更改列表中的所有条目。
这是一个非常常见的Python'陷阱'适合初学者。