python - 更改嵌套列表中的单个值时多个值会发生变化

标签 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]

有谁知道为什么会这样吗?

感谢您的帮助!

最佳答案

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

对于初学者来说,这是一个非常常见的 Python“陷阱”。

关于python - 更改嵌套列表中的单个值时多个值会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42195959/

相关文章:

excel - 使用 xlwt 将公式写入 Excel 工作表后,通过 xlrd 读取带有公式的单元格返回空白

python - open() 不在 for 循环中打开文件描述符

python - 从 python 中的可调用或 lambda 填充列表或元组

c++ - 返回指向列表中对象的指针

python - Flask request.files 不在 'file' 中

python - 如何将由列表组成的变量作为参数传递给另一个python脚本

python - 终止剩余的线程

c# - 从列表中读取项目并将其显示为字符串

获取大小为 1 的列表的单个元素的 Pythonic 方法

python - 如何确定参数是对象还是内置?