2013-09-28 157 views
-1

我想有一個不錯的set all list elements to a default value函數。我提出的那個不起作用,但我的第二個解決方案是。任何人都可以告訴我爲什麼它的作用是單向的,而不是其他的?爲什麼我不能以這種方式更改列表?

解決方案一:

def set_all(the_list,value): #NOT doing anything 
    for item in the_list: 
     item = value 

解決方法二:

def set_all(the_list,value): #working as intended 
    for i,item in enumerate(the_list): 
     the_list[i] = value 
+0

請參閱http://stackoverflow.com/q/575196/395760 - 我不認爲它是一個確切的重複,但它肯定是高度相關的。 – delnan

回答

5

當你這樣做:

for item in the_list: 
    item = value 

你只能重新分配item別的東西(value,詳述cally),但是您並未觸摸參考the_list[i]該列表對於原始項目。

因此,您實際上並未觸摸列表,因此它不會更改。


你可以看一下這種方式:

當你做for item in the_list,創建一個新的參考底層對象:item

當你做item = value時,你正在改變那個引用並指向其他東西。但是另一個參考文獻,即列表對潛在客體的參考文獻保持不變。

當然,當你做the_list[i]時,你實際上正在改變列表對象的引用,這就是它的工作原理。

+0

所以當我迭代時,'item'是'the_list [x]'的副本嗎?因此只對讀取數據有用,而不是改變/寫入它? – Wurstbro

+0

@Wurstbro不,它不是副本。 Python中沒有適當的變量。只有名稱指向基礎對象。當你執行'item.some_method()'時,你可能會改變對象(例如,如果'item'是一個'list'並且你叫'append'),並且所有指向該對象的名字將會看到一個對象已被修改。但是,當您通過重新分配名稱**來更改名稱時,您不會更改基礎對象,也不會更改其中存在的其他引用。 –

+0

我可以說'item'指向'the_list [x]',然後指向'value'? – Wurstbro

2

在第一個循環中,item是對列表中項目的引用,而不是對列表中的某個插槽的引用。更改它不會更改列表。

要更改列表,您需要知道您正在處理的是哪個插槽,這是您在第二種情況下執行的操作。

0

爲什麼不用這個?它更容易

the_list = [default_value]*len(the_list) 
+0

嗯,它不會改變列表,但會創建一個新列表,如果有其他參考,這很重要。但無論如何,這不是問題 - 問題只是「爲什麼第一個不行(但第二個行不通)」? – delnan

+0

我需要一種方法來改變現有列表中的所有值 – Wurstbro

+0

耶是有道理的,我想如果你不介意做一個新的它將是一個更乾淨的解決方案。 –

相關問題