以下两种在Python中初始化矩阵的方式之间的区别

时间:2019-05-15 04:36:04

标签: arrays python-3.x matrix

说我有一个4行5列的2D数组。我只想分配第一行元素及其各自的索引,以获取下面的2D数组。

0 1 2 3 4
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0 

我首先尝试过:

array1 = [[0]*cols]*rows
print(array1)

for i in range(cols):
    array1[0][i] = i
print(array1)

结果:

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

这不是我想要做的。 每行都在更新,而不仅仅是第一行。

但是下面的代码给出了我想要的结果。

array2 = [[0 for x in range(cols)] for y in range(rows)]
print(array2)
for i in range(cols):
    array2[0][i] = i
print(array2)

结果:

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 
[[0, 1, 2, 3, 4], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

两个片段之间的唯一区别是array1和array2的初始化方式。 我很想知道为什么他们两个的工作方式不同。 将不胜感激。

-谢谢

1 个答案:

答案 0 :(得分:1)

当您执行array1 = [[0]*cols]*rows时,所有内部列表具有相同的引用,因此,当您更改其中一个内部列表时,所有内部列表都会被更新(所有子列表都更新为[0, 1, 2, 3, 4]

这种行为可以在下面的一个简单示例中看到

In [9]: a =[[0]*2]*2                                                                                                                                                                                    

In [10]: a                                                                                                                                                                                              
Out[10]: [[0, 0], [0, 0]]

In [11]: a[0][0] = 1                                                                                                                                                                                    
#The first element of both sublists changed to 1
In [12]: a                                                                                                                                                                                              
Out[12]: [[1, 0], [1, 0]]

当您像array2 = [[0 for x in range(cols)] for y in range(rows)]那样初始化时,情况并非如此,所有内部列表都有不同的引用,因此您会获得预期的行为。

In [13]: a =[[0 for _ in range(2)] for _ in range(2)]                                                                                                                                                   

In [14]: a                                                                                                                                                                                              
Out[14]: [[0, 0], [0, 0]]
#The first element of only the first sublist changed to 1
In [15]: a[0][0] = 1                                                                                                                                                                                    

In [16]: a                                                                                                                                                                                              
Out[16]: [[1, 0], [0, 0]]

因此,实例化2D列表的正确方法是第二种方法!