Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 更新二维数组中元素的值_Arrays_Python 3.x_Matrix - Fatal编程技术网

Arrays 更新二维数组中元素的值

Arrays 更新二维数组中元素的值,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]

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

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

这种情况会发生,因为列表在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中进行更新时,任何列表中的任何更改都将反映在所有其他列表中,因为它们在内部都是单一列表。