【问题标题】:Update the value of element in 2-dimensional array更新二维数组中元素的值
【发布时间】:2021-04-28 09:08:03
【问题描述】:

我想知道为什么下面的两个代码段有不同的输出。有人可以解释一下吗?

代码 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], [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]

【问题讨论】:

  • for循环中通过print(id(i))打印每个列表的内存位置。您会注意到,在代码 1 中,所有列表都指向相同的内存位置,而在代码 2 中,每个列表都分配了不同的内存。因此,当您在代码 1 中更新时,任何列表中的任何更改都将反映在所有其他列表中,因为在内部它们都只是单个列表。

标签: arrays python-3.x matrix


【解决方案1】:

会发生这种情况,因为列表在 python 中是可变的,当您使用 [[0] * d] * d 时,您实际上对列表中的所有列表使用相同的列表引用。

list_1 = [1,2]
list_2 = list_1
list_2[0] = 3
print(list_1) -> output: [3,2]

它发生了,因为list_1list_2 链接到同一个对象。您可以检查:

print(id(list_1))
print(id(list_2))

或者在您的情况下,您可以尝试打印 ids 而不是 value:

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])

它将在每次迭代时创建一个新的列表对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 2021-10-31
    • 1970-01-01
    • 2020-10-10
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    相关资源
    最近更新 更多