2013-12-11 47 views
1

的诀窍是:Python的乘法序列招

IPython prompt: 

In [1]: A = [ [] ] * 2 

In [2]: A 
Out[2]: [[], []] 

In [3]: A[0].append(1) 

In [4]: A 
Out[4]: [[1], [1]] 

明显,这不是我期望的结果,我想什么是[[1], []]。所以为什么?我发现没有关于python乘法序列的文档中的ref。

是否有任何优雅(不使用任何显式循环)的方式来做到这一点?

回答

4

A = [ [] ] * 2创建了两个引用到相同名单列表:

>>> A = [ [] ] * 2 
>>> id(A[0]) 
24956880 
>>> id(A[1]) 
24956880 
>>> id(A[0]) == id(A[1]) 
True 
>>> 

相反,你需要使用list comprehension

>>> A = [[] for _ in xrange(2)] 
>>> A 
[[], []] 
>>> A[0].append(1) 
>>> A 
[[1], []] 
>>> 

注意,如果你是Python 3的是, .x,您需要将xrange替换为range

+0

+1 for id()function –

2

[ [] ]是包含(引用)列表的数组。当您乘以2时,会得到一个列表,其中包含两个对列表的相同列表。试试这个:

A = [[] for i in range(5)] 

它会为每个range的勾号生成一个新的空列表。

真的不可能有一个无循环的版本,因为你真的需要构造多个列表;不可能有捷径。

+0

没问题。我很高兴你已经更新了答案。 :) – mgilson

+1

更正很好,但我们确实不需要看到划掉的旧版本 - 这很让人分心。 –

+0

他收回了评论,因为你解决了这个问题。如果你愿意,我也会这样做。如果你自己的评论现在看起来不合适,你可以自己删除。 –