2013-12-11 49 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

他收回了評論,因爲你解決了這個問題。如果你願意,我也會這樣做。如果你自己的評論現在看起來不合適,你可以自己刪除。 –