Python - 创建独特元素的常量数组

时间:2017-08-22 08:53:14

标签: python arrays

我最近尝试使用

实例化一个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寻址更改的独特元素?

2 个答案:

答案 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]]