2012-03-31 169 views
5

我在Python中初始化二维数组时遇到了问题。我想一个6x6的阵列,我做在Python中初始化二维数组

arr = [[None]*6]*6 

但是当我做:

>>> arr[1][2]=10 
>>> arr 
[[None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None]] 

通知我只设置1项,并在所有行的“复制”。怎么了?我认为它与它引用相同的列表有关,但我该如何解决这个问题?

我想通

for key, _ in algos.items(): 
    algoData[key] = [] 
    for i in range(0,6): 
     algoData[key].append([]) 
     for j in range(0,6): 
      algoData[key][i].append(None) 

的作品,但似乎很长,只是初始化一个空的6x6阵列,如果我想要一个10000x10000阵列,这将是非常低效的?

UPDATE

可我也初始化二维数组的字典?我有一本字典,如:

algos = { "FIFO": ..., "LRU": ..., "Random": ... } 

我想初始化像下面的字典:

algoData = { "FIFO": 2D arr, "LRU": 2D arr, "Random": 2D arr } 

回答

14

使用列表解析,你可以说:

arr = [[None for x in range(6)] for y in range(6)] 

然后,你将有arr[1][2] = 10工作如预期。然而,这不是一件很正常的事情。你打算使用嵌套列表来做什么?可能有更好的方法。例如,使用numpy包处理数组变得更容易。

+0

我想存储用于matplotlib的数据(一个3D表面图) – 2012-03-31 08:20:32

+3

在这种情况下,我肯定会推荐numpy。如果你想看一个示例,它用在[这个例子](http://matplotlib.sourceforge.net/examples/animation/simple_3danim.html)中。节省工作;这是一个很棒的包装。 – Cameron 2012-03-31 08:24:07

+0

所以我需要的线将只是'lineData = np.empty((dims,length))'? – 2012-03-31 10:37:06

15

@Cameron在提示您使用NumPy处理数值数据数组时是正确的。对于你的问题的第二部分,〜Niklas B.发现他的建议是使用defaultdict

未涉及的内容是为什么[[None]*6]*6行为异常。

答案是[None]*6在它创建六个None个列表(像你期望的那样),但[list]*6不使list六个独立的副本 - 它使一个参考相同list六份。

习惯性Python有一个部分可以更好地解释这一点:"Other languages have variables - Python has names"