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

Multiple values change when changing a single value in a nested list

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

有谁知道为什么会这样?

感谢您的帮助!

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

这是一个很常见的 Python 'gotcha' 适合初学者。