2015-06-20 79 views
1

下面的代碼不爲工作打算:Python列表,增量和返回修改列表

l = [1,1] 

def modifyList(list): 
    for element in list: 
    element += 1 
    return list 

,當我跑我期望列表:

modifyList(l) 

爲[2,2],而不是[1,1]

有人可以解釋爲什麼python的行爲是這樣嗎?

+0

或http://stackoverflow.com/questions/23647261/why-i-cant-re-assign-a-variable-in-a-for-loop-in-python?lq=1 – vaultah

回答

4

您需要使用索引和增量來訪問列表元素:

def modifyList(lst): 
    for ind, _ in enumerate(lst): 
     lst[ind] += 1 # access list element by index and increment 
    return lst 

或者用一個列表理解和簡單的加1給每個元素:

def modifyList(lst): 
    lst[:] = [ele +1 for ele in lst] # lst[:] changes the original list 
    return lst 

如果要修改原列表到位,你並不需要返回值,如果你想創建一個新列表,那麼只需返回列表理解:return [ele +1 for ele in lst]

def mod_in_place(lst): 
    lst[:] = [ele +1 for ele in lst] # lst[:] changes the original list 

現在只需調用傳遞列表中的功能將改變傳遞的原始列表/對象:

In [3]: l = [1,1] 
In [4]: mod_in_place(l)  
In [5]: l 
Out[5]: [2, 2]  

要創建一個新的列表/對象:

def create_new_list(lst): 
    return [ele + 1 for ele in lst] 

現在創建一個新的列表離開原來那樣是:

In [7]: l = [1,1] 
In [8]: l2 = create_new_list(l)  
In [9]: l 
Out[9]: [1, 1] # original list not changed 
In [10]: l2 
Out[10]: [2, 2] 

你的代碼只是創建了一個新的對象與element += 1,整型是不可變的,所以你沒有影響存儲在列表中的對象。如果你的列表中有一個可變對象,並且你改變了它,那麼這些改變會被反映出來,但是在你的代碼中,你只需創建一個新的變量並將其扔掉。

+0

謝謝 - 一問題,爲什麼我們需要說'lst [:] = comp'而不僅僅是'lst = comp' - 爲什麼要使用slice? –

+0

@PipS,它會像for循環一樣更改原始列表,您可以刪除返回結果,打印原始列表'l',您將看到更改。如果你想要一個新的列表,因爲我在我的答案中評論,只是返回列表comp –

+0

你可以使用函數修改列表到位嗎?我認爲這些參數是隱式分開的副本,您需要將它們指定爲全局或使用返回來實際修改傳入的參數。 – SuperBiasedMan

1

的原因是,當你說:

for element in list: 
    element += 1 

您正在從列表中的一個元素,並將其分配給變量element但這不會更新列表中的元素。因此,名單保持不變,未經修改。

要修改列表:

for i in range(len(list)): 
    list[i]+=1 

這將1反覆遞增每個元素。