2013-04-16 36 views
3

我想重新分配Python中的列表中的每個項目。如何在Python中重新分配列表中的項目?

In [20]: l = [1,2,3,4,5] 
In [21]: for i in l: 
    ....:  i = i + 1 
    ....:  
    ....:  

但是名單根本沒有改變。

In [22]: l 
Out[22]: [1, 2, 3, 4, 5] 

我想知道爲什麼會發生這種情況。任何機構可以解釋清單迭代詳細?謝謝。

回答

7

你不能那樣做,你只是改變綁定到名稱i值。在for循環的每次迭代中,i被綁定到列表中的值。它不是一個指針,通過更改i的值,您正在更改列表中的值。相反,正如我之前所說的,它只是一個名稱,而您只是更改名稱所指的值。在這種情況下,i = i + 1i綁定到值i + 1。所以你實際上並沒有影響列表本身,要做到這一點,你必須通過索引來設置它。

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

>>> L 
[2, 3, 4, 5, 6] 

一些Python可能希望重複這樣的:

for i, n in enumerate(L): # where i is the index, n is each number 
    L[i] = n + 1 

但是你可以很容易地實現與列表理解相同的結果:

>>> L = [1,2,3,4,5] 
>>> L = [n + 1 for n in L] 
>>> L 
[2, 3, 4, 5, 6] 

欲瞭解更多信息:http://www.effbot.org/zone/python-objects.htm

+0

爲什麼'ID(L [0])'和'因爲我在L:打印ID(我)'打印出相同的ID? – Blender

+0

@Blender因爲它們都引用同一個對象。我的解釋有什麼問題嗎? – jamylak

+0

使用'枚舉(L)'而不是'範圍(len(L))'。列表理解只有當你將它重新賦予相同的名稱時纔會有意的:'L = [i + 1 for i in L]'否則表達式不會改變原來的'L'。 –

1

這是因爲Python如何處理變量及其引用的值。

您應該修改列表元素本身:

for i in xrange(len(l)): 
    l[i] += 1 
+2

或'枚舉(L)' –

0

最初我是一個指向列表中的項目的指針,但是whe你重新分配它,它會指向新的號碼,這就是爲什麼列表不會被改變。

對於可變對象的列表,將工作:

class Number(object): 
    def __init__(self,n): 
     self.n=n 
    def increment(self): 
     self.n+=1 
    def __repr__(self): 
     return 'Number(%d)' % self.n 

a = [Number(i) for i in xrange(5)] 

print a 
for i in a: 
    i.increment() 
print a 

但INT是不可變的,當你對他們做的工作你會得到一個新的int對象,這就是爲什麼它不工作在你的情況。

1
>>> a = [1, 2, 3, 4, 5] 
>>> a = [i + 1 for i in a] 
>>> a 
[2, 3, 4, 5, 6] 
相關問題