Arrays 更新二维数组中元素的值
我想知道为什么下面的两个代码段有不同的输出。有人能解释一下吗 代码1Arrays 更新二维数组中元素的值,arrays,python-3.x,matrix,Arrays,Python 3.x,Matrix,我想知道为什么下面的两个代码段有不同的输出。有人能解释一下吗 代码1 d = 5 matrix_list = [[0] * d] * d matrix_list[0][3] = 1 for i in matrix_list: print(i) Output: [0, 0, 0, 1, 0] [0, 0, 0, 1, 0] [0, 0, 0, 1, 0] [0, 0, 0, 1, 0] [0, 0, 0, 1, 0] 代码2 matrix_list = [[0, 0, 0, 0, 0]
d = 5
matrix_list = [[0] * d] * d
matrix_list[0][3] = 1
for i in matrix_list:
print(i)
Output:
[0, 0, 0, 1, 0]
[0, 0, 0, 1, 0]
[0, 0, 0, 1, 0]
[0, 0, 0, 1, 0]
[0, 0, 0, 1, 0]
代码2
matrix_list = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
matrix_list[0][3] = 1
print()
for i in matrix_list:
print(i)
Output:
[0, 0, 0, 1, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
这种情况会发生,因为列表在python中是可变的,当您按照
[[0]*d]*d
操作时,实际上会对列表中的所有列表使用相同的列表引用
list_1 = [1,2]
list_2 = list_1
list_2[0] = 3
print(list_1) -> output: [3,2]
这是因为list_1
和list_2
链接到同一个对象。您可以通过以下方式进行检查:
print(id(list_1))
print(id(list_2))
或者在您的情况下,您可以尝试打印ID而不是值:
for i in matrix_list:
print(id(i))
这意味着在您的案例中创建列表的正确方法是:
list_of_lists = []
for i in range(5):
list_of_lists.append([0, 0, 0, 0, 0])
它将在每次迭代时创建一个新的列表对象。通过
for
循环中的print(id(i))
打印每个列表的内存位置。您会注意到,在代码1中,所有列表都指向相同的内存位置,而在代码2中,每个列表都分配了不同的内存。因此,当您在代码1中进行更新时,任何列表中的任何更改都将反映在所有其他列表中,因为它们在内部都是单一列表。