2012-11-11 71 views
3

Python中的del語句應用於列表時會產生一些非常奇怪的現象。它不僅會刪除相關列表中的條目,而且還會「回溯」以刪除變量所源自的任何列表中的相同元素。python del函數中的「backtracking」變量

例如:

>>> x 
[1, 2, 3, 4, 5] 
>>> z=x 
>>> del z[1] 
>>> z 
[1, 3, 4, 5] 
>>> x 
[1, 3, 4, 5] 

換句話說,即使我申請刪除對z,刪除也適用於x。這種「回溯」不會提出任何其他命令或功能,例如

>>> x=[1,2,3,4,5] 
>>> z=x 
>>> z+[6] 
[1, 2, 3, 4, 5, 6] 
>>> x 
[1, 2, 3, 4, 5] 

將增加功能應用於z使x不受影響,因爲它非常適合。

這讓我頭痛,因爲我正在刪除'NA'腳本。你知道del聲明是怎麼回事,我該如何解決這個問題,以便如果我設置了z=x,然後將del應用到z,x保持不變?

+1

閱讀:http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages -have-variables – FogleBird

回答

9

z = x不製作該列表的副本。 z和x現在指向相同的列表。通過名稱z和x可以看到該列表的任何修改。

對於z + [6],您沒有將結果返回給z。這樣做後嘗試打印z。它將保持不變,就像x一樣。

z += [6]將分配結果返回到z將是必要的,它將具有與您的第一個示例相同的行爲。

您可以複製使用這些方法的一個列表:

z = x[:] 
z = list(x) 
+0

關閉,但是你缺少'z + = [6]'和'z = z + [6]'之間的重要區別。 – Miles

+0

@Miles'z + = [6]'和'z = z + [6]'之間有什麼區別?似乎是同樣的事情。我錯過了什麼嗎? – miki725

+0

@ miki725:'z + = [6]'是'list'上的就地操作。 'z + [6]'創建一個新的'list'。 – eryksun