我想重新分配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]
我想知道爲什麼會發生這種情況。任何機構可以解釋清單迭代詳細?謝謝。
我想重新分配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]
我想知道爲什麼會發生這種情況。任何機構可以解釋清單迭代詳細?謝謝。
你不能那樣做,你只是改變綁定到名稱i
值。在for
循環的每次迭代中,i
被綁定到列表中的值。它不是一個指針,通過更改i
的值,您正在更改列表中的值。相反,正如我之前所說的,它只是一個名稱,而您只是更改名稱所指的值。在這種情況下,i = i + 1
將i
綁定到值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]
這是因爲Python如何處理變量及其引用的值。
您應該修改列表元素本身:
for i in xrange(len(l)):
l[i] += 1
或'枚舉(L)' –
最初我是一個指向列表中的項目的指針,但是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對象,這就是爲什麼它不工作在你的情況。
>>> a = [1, 2, 3, 4, 5]
>>> a = [i + 1 for i in a]
>>> a
[2, 3, 4, 5, 6]
爲什麼'ID(L [0])'和'因爲我在L:打印ID(我)'打印出相同的ID? – Blender
@Blender因爲它們都引用同一個對象。我的解釋有什麼問題嗎? – jamylak
使用'枚舉(L)'而不是'範圍(len(L))'。列表理解只有當你將它重新賦予相同的名稱時纔會有意的:'L = [i + 1 for i in L]'否則表達式不會改變原來的'L'。 –