名單

2012-04-21 202 views
0
的瞭解列表

可能重複:
Unexpected feature in a Python list of lists
Python list confusion名單

考慮下面的代碼:

a = [[]] * 3 
a[1].append("foo") 

我期望的a值成爲:

[[], ["foo"], []] 

代替的a每一個元素被更新:

[["foo"], ["foo"], ["foo"]] 

能有人請解釋爲什麼在列表中的每個元素得到了更新,而不是僅僅定義的元素(a[1])的?我的邏輯中是否有根本錯誤?

對於什麼是值得我運行Python2.7

+3

這已被問過千次..讓我找到一個重複:) – 2012-04-21 14:28:33

+0

謝謝。很難找到這個問題的正確標題,所以我無法輕鬆找到重複。謝謝你指出:) – rahmu 2012-04-21 14:30:35

+0

@rahmu:是的,我知道,這是不幸的,但它肯定不是你的錯:)玩得開心。 – 2012-04-21 14:30:57

回答

1

列出Python中的對象,當你一個列表分配給另一個變量,改變或者將改變實際列表,例如這意味着

a = [] 
b = a 
b.append("hi") 
print a 
// a is now ["hi"] 

當你做作業

a = [[]] * 3 

這等於說

inner_list = [] 
outer_list = [inner_list, inner_list, inner_list] 

換句話說,所有的內部列表都是相同的對象。沒有不同的對象,你認爲。

爲了得到你想要的效果,你應該做的:

outer_list = [] 
for i in range(0, 3): 
    outer_list.append([]) 

它創建了一個3點內列出的對象,並提出了到外部對象。

+2

通常的做法是使用列表理解:'lst = [[] for _ in range(3)]' – 2012-04-21 14:39:14

0

我想你會發現正在發生的事情是什麼蟒蛇正在做的是創造:

outer_list = [] 
inner_list = [] 
outer_list = [inner_list,inner_list,inner_list] 

或更清楚地解釋它, outer_list和內部列表創建一次,然後inner_list被複制* 3轉化爲outer_list,這意味着outer_list中的所有3個列表實際上是一個參考拷貝了3次相同的inner_list