2012-03-31 163 views
-1

可能重複:
Python list append behaviorPython的嵌套列表

爲什麼這樣的代碼:

x = [[]]*3 
x[0].append('a') 
x[1].append('b') 
x[2].append('c') 
x[0]=['d'] 

print x 

打印[[ 'd'],[ '一個',' b','c'],['a','b','c']]?

+1

這個問題每天都要問一次......問題似乎是,除非您已經知道發生了什麼,否則您無法搜索解決方案。 – 2012-03-31 13:09:50

+0

爲了禁止這種行爲,最好使用下面的語法創建列表列表:>>>​​ x = [[] for _ in range(3)] – 2012-03-31 15:44:54

回答

5

這一步是最好的解釋步:

 
>>> x = [[]]*3 
>>> x 
[[], [], []] 
>>> x[0].append('a') 
>>> x 
[['a'], ['a'], ['a']] 
>>> x[1].append('b') 
>>> x 
[['a', 'b'], ['a', 'b'], ['a', 'b']] 
>>> x[2].append('c') 
>>> x 
[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']] 
>>> x[0]=['d'] 
>>> x 
[['d'], ['a', 'b', 'c'], ['a', 'b', 'c']] 

第一條語句創建一個具有三個引用其中的相同元素的列表。所以當你修改第一個元素時,你也在修改第二個和第三個元素。因此,附加語句爲列表中的每個元素添加一個數字。

+0

我知道這很誘人,但這個問題已經有50個很好的答案。只需在評論中鏈接一個複製品並/或將其標記爲複製品,直到您有足夠的代表投票結束。 – agf 2012-03-31 13:21:20

+0

作用於列表的操作符*會生成淺拷貝 - 即。 – sashab 2012-03-31 18:05:19