2014-06-11 103 views
5

所以下面是令我困惑的。Python pop()vs pop(0)

#!/usr/bin/python 

test = [0, 0, 0, 1, 2, 3, 4, 5, 6] 
test1 = [0, 0, 0, 1, 2, 3, 4, 5, 6] 

for _dummy in test: 
    if(_dummy == 0): 
     test.pop() 
for _dummy in test1: 
    if(_dummy == 0): 
     test1.pop(0) 

print test 
print test1 

結果

ubuntu-vm:~/sandbox$ ./test.py 
[0, 0, 0, 1, 2, 3] 
[0, 1, 2, 3, 4, 5, 6] 

也許,我從根本上誤解的流行是如何實現的。但我的理解是,它會刪除列表中給定索引處的項目,並將其返回。如果沒有指定索引,則默認爲最後一個項目。所以看起來,在第一個循環中它應該從列表的左邊移除3個項目,而在第二個循環中它應該從列表的末尾移除3個項目。

+0

這在我的機器上完美地工作。我正在使用Python 2.7.6 – XrXrXr

+0

在遍歷它時不能對列表進行變異。 – univerio

+0

我在兩個不同的系統上試過這個。其一,是由運行python 2.6的大學提供的IDE。另一個是在我的虛擬機ubuntu上運行2.7.4。嗯。 – PerryDaPlatypus

回答

12

第一次測試並不奇怪;三個元素被刪除。

第二個測試有點令人驚訝。只有兩個元素被刪除。爲什麼?

Python中的列表迭代本質上包含一個遞增索引到列表中。當你刪除一個元素時,你將右側的所有元素都轉移過來。這可能會導致索引指向不同的元素。

例證:

start of loop 
[0,0,0,1,2,3,4,5,6] 
^ <-- position of index 

delete first element (since current element = 0) 
[0,0,1,2,3,4,5,6] 
^ 

next iteration 
[0,0,1,2,3,4,5,6] 
^

delete first element (since current element = 0) 
[0,1,2,3,4,5,6] 
^

,從現在起沒有零點遇到,所以沒有更多的元素被刪除。


爲了避免將來發生混淆,請儘量不要在迭代它們時修改列表。儘管Python不會抱怨(不像字典,它在迭代過程中不能被修改),但它會導致奇怪的並且通常是違反直覺的情況,比如這個。

+0

fyi,當我運行它時,最後的指針指向2 – Fabricator

+0

@ user3678068:指針?什麼指針?循環從我一路走到最後的地方運行,並且在此之後不修改列表(因爲它從不會看到更多的零)。 – nneonneo

+0

我的意思是「指數的位置」指向2而不是1 – Fabricator

4

您在修改列表時正在迭代它們,導致混淆。如果你看第一個元素,刪除它,然後繼續查看第二個元素,那麼你錯過了一個元素。

最初處於第二位的元素從未被檢查,因爲它在迭代期間「改變了位置」。

+0

非常感謝! – PerryDaPlatypus

1

因爲在列表或棧工作在後進先出[LIFO]所以pop()使用它刪除最後一個元素的列表

凡爲pop(0)意味着它刪除元素是第一元素的索引名單

按照該文件

list.pop([i]): 

Remove the item at the given position in the list, and return it. If no index is specified, a.pop() removes and returns the last item in the list. (The square brackets around the i in the method signature denote that the parameter is optional, not that you should type square brackets at that position. You will see this notation frequently in the Python Library Reference.)