下面的代碼不爲工作打算:Python列表,增量和返回修改列表
l = [1,1]
def modifyList(list):
for element in list:
element += 1
return list
,當我跑我期望列表:
modifyList(l)
爲[2,2],而不是[1,1]
有人可以解釋爲什麼python的行爲是這樣嗎?
下面的代碼不爲工作打算:Python列表,增量和返回修改列表
l = [1,1]
def modifyList(list):
for element in list:
element += 1
return list
,當我跑我期望列表:
modifyList(l)
爲[2,2],而不是[1,1]
有人可以解釋爲什麼python的行爲是這樣嗎?
您需要使用索引和增量來訪問列表元素:
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
,整型是不可變的,所以你沒有影響存儲在列表中的對象。如果你的列表中有一個可變對象,並且你改變了它,那麼這些改變會被反映出來,但是在你的代碼中,你只需創建一個新的變量並將其扔掉。
謝謝 - 一問題,爲什麼我們需要說'lst [:] = comp'而不僅僅是'lst = comp' - 爲什麼要使用slice? –
@PipS,它會像for循環一樣更改原始列表,您可以刪除返回結果,打印原始列表'l',您將看到更改。如果你想要一個新的列表,因爲我在我的答案中評論,只是返回列表comp –
你可以使用函數修改列表到位嗎?我認爲這些參數是隱式分開的副本,您需要將它們指定爲全局或使用返回來實際修改傳入的參數。 – SuperBiasedMan
的原因是,當你說:
for element in list:
element += 1
您正在從列表中的一個元素,並將其分配給變量element
但這不會更新列表中的元素。因此,名單保持不變,未經修改。
要修改列表:
for i in range(len(list)):
list[i]+=1
這將1
反覆遞增每個元素。
或http://stackoverflow.com/questions/23647261/why-i-cant-re-assign-a-variable-in-a-for-loop-in-python?lq=1 – vaultah