我一直在觀察這種奇怪的行爲。現在我想知道原因。Python:在列表中更改元素
請看下面的例子。
有人可以解釋爲什麼 - 以及是否有其他選項更類似於第一個版本,做第二個選項。
>>> a
>>> [1, 0, 1, 1]
>>> for el in a:
el = 1
>>> a
>>> [1, 0, 1, 1]
>>> for i in range(len(a)):
a[i] = 1
>>> a
>>> [1, 1, 1, 1]
我一直在觀察這種奇怪的行爲。現在我想知道原因。Python:在列表中更改元素
請看下面的例子。
有人可以解釋爲什麼 - 以及是否有其他選項更類似於第一個版本,做第二個選項。
>>> a
>>> [1, 0, 1, 1]
>>> for el in a:
el = 1
>>> a
>>> [1, 0, 1, 1]
>>> for i in range(len(a)):
a[i] = 1
>>> a
>>> [1, 1, 1, 1]
你的第一個片段:
for el in a:
獲取項目的唯一的值a
,他們不是在項目在列表的引用。因此,當您嘗試重新分配它時,只需更改el
的值,而不是列表中的項目。
這枚:
a[i]
檢索的a
自己的項目,而不僅僅是值。
要更改的a
所有值,你可以創建一個新的副本,並重新分配回a
:
a = [1 for _ in a]
這是最有效的方法。如果你想有兩個值,並重新分配它的索引,使用enumerate
:
for index, el in enumerate(a):
print el #print the current value
a[index] = 1 #change it,
print el #and print the new one!
希望這有助於!
我通常最終會使用這樣的:
a = [1 for el in a]
列表理解是避免指數列表更新的項目我的首選方式。
Pythons變量是對象的名稱,而不是內存中位置的名稱。因此
el = 1
不改變el
指向是1
的對象。相反,它使el
現在指向對象1
。它根本不會修改列表中的任何內容。對於你必須直接修改列表:
a[2] = 1
快速列舉給出了元素的不可變的副本,這樣的速度優勢指數迭代方法。
for el in a:# el is immutable
其中作爲
for i in range(len(a)):
a[i] = 1
在其存儲器位置修改值作爲listname[<index>]
實際上是baseaddress+index*offset
。指數從零開始的原因之一
那麼這是一個快速反應!謝謝,不知道。 – user1850980
非常歡迎您!:) – aIKid
好吧,'el' *是對項目本身的引用。但是,不,這不是對列表中位置的引用,我想這就是你的意思。 –