更改嵌套列表中的单个值时,多个值会更改

时间:2017-02-13 02:53:05

标签: python python-2.7 list nested-lists

当我更改嵌套列表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]

有谁知道为什么会这样?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

创建grid = [[0]*10]*10时,实际上是在创建一个对同一个对象([0] s列表)的引用数组。因此,当您通过一个引用更改对象时,这将更改列表中的所有条目。

这是一个非常常见的Python'陷阱'适合初学者。