修改 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]
因为 is
是 True
如果两个对象在内存中是同一事物。
改为这样做
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
的新数组。
我正在尝试更改 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]
因为 is
是 True
如果两个对象在内存中是同一事物。
改为这样做
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
的新数组。