在 python 中创建一个包含初始数据的矩阵,然后修改一个单元格

Create a matrix with initiated data in python then modify a cell

我正在尝试用 python 中的列表创建一个初始值为 0 的 3x3 矩阵,然后修改其中的一个单元格,如下所示:

matrix = [[0]*3]*3

当我为单元格 x=1 y=1 分配值 1 时,如下所示:

matrix[1][1] = 1

结果是:

[[0,1,0],[0,1,0],[0,1,0]]

但是如果我按如下方式启动矩阵:

matrix = [[0,0,0],[0,0,0],[0,0,0]]

输出正确如下:

[[0,0,0],[0,1,0],[0,0,0]]

谁能解释一下为什么第一个示例中的输出不正确?

这是因为 * 运算符不会在 multi-dimensional 列表中创建新数组,它只是复制它们。

您使用 [0]*3 创建第一个列表,其他列表只是同一个列表的副本。由于列表是可变的,因此编辑其中一个列表会编辑所有列表。

在您的第二个示例中,所有三个 sub-lists 都是硬编码且唯一的,因此编辑其中一个只会编辑那个。

如果您使用 list-comprehension 创建矩阵,它也会创建唯一的 sub-lists。

像这样:

matrix = [[0]*3 for _ in range(3)]

当你使用 * 它复制并引用相同的参考地址

matrix = [[0] * 3]*3
print(matrix)
for i in matrix:
    print(id(i))
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
2799443720
2799443720
2799443720

[Program finished]

ID 相同,因此将对所有人进行更改 您也可以使用 for 循环来避免这种情况。 希望对您有所帮助...:)