在Python列表中修改一个元素时出现错误

17 浏览
0 Comments

在Python列表中修改一个元素时出现错误

我正在尝试更改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。我该如何只更改第一个列表的第一个元素。

0
0 Comments

错误的原因是每个矩阵的行不是一个独立的数组,而是对同一个数组的引用。这是因为在Python中,列表是按引用传递的,而不是复制每个单独的值。

在代码的第二部分中,实际上你所做的是:

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

你可能会更好地使用以下代码:

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

这将为创建矩阵中的每一行创建一个新的由0填充的数组。

这样做的结果是:

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

通过这种方法,你可以创建一个独立的数组来构成矩阵的每一行,而不是使用对同一个数组的引用。这样,当你修改一个元素时,不会影响到其他行。

0
0 Comments

这是一个关于Python列表中修改元素时出现的经典问题。问题的根源在于Python中所有的对象都是引用。在这种情况下,由于is在内存中比较两个对象是否相同,所以matrix[0]、matrix[1]和matrix[2]指向的是同一个对象。为了解决这个问题,可以使用以下方法:

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

这样,matrix[0] is matrix[1] is matrix[2]将返回False。

另外,也可以使用专门用于处理数值数组的numpy库,它不会出现这些问题。

感谢您清晰的解释,祝您有一个愉快的一天 😀

0