2013-12-16 110 views
0

我一直在觀察這種奇怪的行爲。現在我想知道原因。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] 

回答

3

你的第一個片段:

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! 

希望這有助於!

+0

那麼這是一個快速反應!謝謝,不知道。 – user1850980

+0

非常歡迎您!:) – aIKid

+0

好吧,'el' *是對項目本身的引用。但是,不,這不是對列表中位置的引用,我想這就是你的意思。 –

1

我通常最終會使用這樣的:

a = [1 for el in a] 

列表理解是避免指數列表更新的項目我的首選方式。

0

Pythons變量是對象的名稱,而不是內存中位置的名稱。因此

el = 1 

不改變el指向是1的對象。相反,它使el現在指向對象1。它根本不會修改列表中的任何內容。對於你必須直接修改列表:

a[2] = 1 
0

快速列舉給出了元素的不可變的副本,這樣的速度優勢指數迭代方法。

for el in a:# el is immutable 

其中作爲

for i in range(len(a)): 
     a[i] = 1 

在其存儲器位置修改值作爲listname[<index>]實際上是baseaddress+index*offset。指數從零開始的原因之一