更改嵌套列表中的单个值时会更改多个值
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' 适合初学者。
当我更改嵌套列表 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' 适合初学者。