的訣竅是: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。
是否有任何優雅(不使用任何顯式循環)的方式來做到這一點?
的訣竅是: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。
是否有任何優雅(不使用任何顯式循環)的方式來做到這一點?
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
。
[ [] ]
是包含(引用)列表的數組。當您乘以2時,會得到一個列表,其中包含兩個對列表的相同列表。試試這個:
A = [[] for i in range(5)]
它會爲每個range
的勾號生成一個新的空列表。
真的不可能有一個無循環的版本,因爲你真的需要構造多個列表;不可能有捷徑。
沒問題。我很高興你已經更新了答案。 :) – mgilson
更正很好,但我們確實不需要看到劃掉的舊版本 - 這很讓人分心。 –
他收回了評論,因爲你解決了這個問題。如果你願意,我也會這樣做。如果你自己的評論現在看起來不合適,你可以自己刪除。 –
+1 for id()function –