假设我使用零初始化创建了3x4的2D数组。 然后,我想在arr [0] [1]中添加100,我希望将100添加到arr [0] [1]单元格中。参见案例1和案例2:
来自案例1: 我看到的是,每个行都添加了100,其中第1列是arr。这不是我的预期。
来自案例2 结果是我所期待的。谁能帮我解释一下?
Case 1:
>>> arr = [[0]*4]*3
>>> arr
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> len(arr)
3
>>> len(arr[0])
4
>>> type(arr)
<class 'list'>
>>> arr[0] [1] = 100
>>> arr
[[0, 100, 0, 0], [0, 100, 0, 0], [0, 100, 0, 0]]
Case 2:
>>> arr = [[0]*4 for _ in range(3)]
>>> arr
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> type(arr)
<class 'list'>
>>> arr[0] [1] = 100
>>> arr
[[0, 100, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
答案 0 :(得分:0)
[0]*4
创建一个对同一对象0的引用列表。因为整数是不可变的,所以可以;更改一个元素会将其替换为新对象。但是,[[0]*4]*3]
创建一个列表,其中包含对同一个 mutable 列表对象的3个引用,其中包含4个对0的引用。正如您所见,更改一个列表的元素,显示作为所有3个参考文献的变化。
在列表推导中,为[0]*4
的每个值创建一个新列表_
,而不是简单地将新的引用存储到同一列表中。