2013-02-13 122 views
1

如果我有一個數字的列表,我想使用一個for循環來增加他們,爲什麼不是這方面的工作:爲什麼我不能使用for循環(python)更改或重新分配列表中的變量值?

>>> list=[1,2,3,4,5] 
>>> for num in list: 
... num=num+1 
... 
>>> list 
[1, 2, 3, 4, 5] 

我有望獲得[2,3,4,5,6] 。

我知道我可以解決這個問題做

>>> newlist=[] 
>>> for num in list: 
... newlist.append(num+1) 
... 
>>> newlist 
[2, 3, 4, 5, 6] 
>>> 

,但必須有一個更簡單的方法。

+0

這是因爲整數是不變的 – 2013-02-13 05:30:07

回答

4

這是因爲你只能得到對列表中變量的引用。當您替換它時,只需更改該引用指向的內容,以便列表中的項保持不變。對此的最佳解釋是follow it visually - 在該鏈接處找到執行可視化,並且應該非常清楚。

請注意,可變對象可以在適當的位置進行變異,並且會影響列表(因爲對象本身將發生更改,而不僅僅是您正在使用的名稱所指向的內容)。爲進行比較,請參見the visualization here

這裏最好的選擇是list comprehension

new_list = [num + 1 for num in old_list] 
4

這是如何在Python中賦值的工件。當你做一個任務:

name = something 

你正在服用的對象something(這是評估右側的結果),並在當地的命名空間綁定的名稱name。當您執行for循環時,您可以獲取循環中元素的引用,然後通過將舊對象加1來構造一個新對象。然後,將該新對象分配給當前名稱空間中的名稱num(反覆)。

如果我們原來的列表中的對象是可變的,你可以變異的對象在for循環中:

lst = [[],[],[]] 
for sublst in lst: 
    sublst.append(0) 

你會看到在原來的列表中的那些變化 - 但是請注意,我們沒有在這裏做任何任務。

當然,如經lattyware建議,你可以用一個列表理解,構建一個新的列表:

new_list = [x+1 for x in old_list] 

,你甚至可以在地方的分配發生了:

old_list[:] = [x+1 for x in old_list] 
1

你可以通過索引數組來實現這一點。

>>> list=[1,2,3,4,5] 
>>> for i in range(len(list)): 
... list[i]=list[i]+1 

這將規避Lattyware談到的參考問題。

+2

這是一種在Python中循環的可怕方法。我誠懇地建議不要這樣做。 – 2013-02-13 05:32:01

+1

你可以在這裏使用'enumerate()'。 – 2013-02-13 05:32:33

+0

@Lattyware同意...我自己使用理解,但我想說明,索引列表允許您直接更改值。 – SethMMorton 2013-02-13 05:34:27

相關問題