我最近尝试使用
实例化一个4x4常量(0)数组a = [[0] * 4] * 4
将数组a
实例化为
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
但是,这并不会创建一个独特元素数组,因为更改任何数组中的元素会更改所有元素,例如:
a[0][0] = 1
将a
改为
[[1, 0, 0, 0],
[1, 0, 0, 0],
[1, 0, 0, 0],
[1, 0, 0, 0]]
我想我明白为什么会发生这种情况(列表的副本会复制列表的指针,除非指定,否则不会创建单独的副本,不像int等)但是我想知道:
是否有任何快速简便的方法来实例化常量数组(不使用任何外部模块,如NumPy),其中包含以后可通过简单a[i][j] = x
寻址更改的独特元素?
答案 0 :(得分:2)
a = [[0 for _ in xrange(4)] for _ in xrange(4)]
应该这样做,它会创建单独的列表
答案 1 :(得分:2)
免费。这里发生了什么 ?当一个人
>>> a = [[0] * 4] * 4
首先,创建一个包含四个[0] * 4
元素的列表0
。请拨打此列表li
。
然后当你执行[li] * 4
时,实际创建一个列表,该列表引用同一对象四次。参见
>>> [id(el) for el in a]
[8696976, 8696976, 8696976, 8696976] # in my case
当进入分配如此
时,得到(不是那个)奇怪的结果>>> a[0][0] = 1
[[1, 0, 0, 0],
[1, 0, 0, 0],
[1, 0, 0, 0],
[1, 0, 0, 0]]
解决方案只是确保列表中的每个元素都是唯一的。比如做
#Python2
>>> a = map(lambda _: [0]*4, range(4))
#Python3
>>> a = list(map(lambda _: [0]*4, range(4)))
#Python2&3
>>> a[0][0] = 1
[[1, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]