在 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 循环来避免这种情况。
希望对您有所帮助...:)
我正在尝试用 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 循环来避免这种情况。 希望对您有所帮助...:)