Python pop()vs pop(0)

时间:2014-06-11 01:55:18

标签: python stack

所以以下让我感到困惑。

#!/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]

也许,我从根本上误解了pop的实现方式。但我的理解是,它删除列表中给定索引处的项目,并返回它。如果未指定索引,则默认为最后一项。所以看起来在第一个循环中它应该从列表左边删除3个项目,而在第二个循环中它应该从列表末尾删除3个项目。

3 个答案:

答案 0 :(得分:15)

第一次测试并不令人惊讶;最后删除了三个元素。

第二次测试有点令人惊讶。只删除了两个元素。为什么呢?

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不会抱怨(不像字典,在迭代期间无法修改),但它会导致像这样的奇怪且通常违反直觉的情况。

答案 1 :(得分:4)

您在迭代时修改列表,导致混淆。如果你看第一个元素,删除它然后继续查看第二个元素,然后你错过了一个元素。

最初排在第二位的元素从未被检查过,因为它改变了位置&#34;在迭代期间。

答案 2 :(得分:3)

因为在列表或堆栈中的最后一个输出[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.)