说我有一个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的初始化方式。 我很想知道为什么他们两个的工作方式不同。 将不胜感激。
-谢谢
答案 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列表的正确方法是第二种方法!