修改 Python 列表中的一个元素时出错

Error modifying one element in a Python list

我正在尝试更改 Python 列表中的元素。按照 https://www.programiz.com/python-programming/matrix 上的教程,我想出了下面的代码。

 matrix = [[0]*6]*3
 print(matrix)
 matrix[0][0] = 2
 print(matrix)

根据 运行 代码,我收到以下输出:

[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
[[2, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0]]

注意输出的最后一行,每个子列表的第一个元素如何设置为 2。我该怎么做才能只更改第一个列表的第一个元素。

这是一个经典的 python gotcha,因为所有 python 对象都是 引用 。在您的情况下,这意味着 matrix[0] is matrix[1] is matrix[2] 因为 isTrue 如果两个对象在内存中是同一事物。

改为这样做

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

现在matrix[0] is matrix[1] is matrix[2]returnsFalse.

或者,使用 numpy 来处理数值数组而不会出现这些问题。

这是因为矩阵中的每一行都不是单独的数组,而是对同一数组的引用。

下面将打印出每一行的内存位置:

for row in matrix:
    print(id(row))

请注意,它们都是一样的。这是因为 python 中的列表被传递 by-reference,而不是复制每个单独的值。

您在代码的第二部分中所做的实质是:

row = [0] * 6
matrix = [row, row, row]

像这样你可能会过得更好:

matrix = [[0 for _ in range(6)] for _ in range(3)]
matrix[0][0] = 2
[[2, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]

这会为您在矩阵中创建的每一行创建一个包含 0 的新数组。