无法通过pop方法删除所有元素

时间:2017-02-13 13:14:14

标签: python python-3.x

当我试图通过循环删除元素时:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 12, 122]
for z in numbers:
    a = numbers.pop(0)
print(numbers)

这就是我得到的:

[8, 9, 10, 18, 12, 122]

为什么它不会删除所有元素?为什么会这样? 谢谢!

1 个答案:

答案 0 :(得分:4)

您的代码将删除一半。因为当您使用for循环时,它将迭代元素。现在你删除了列表另一侧的元素,因此两个指针将在中途相互到达,因此循环将停止。

所以你从列表开始:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 12, 122]
#^

*(插入符号显示for循环指针所在的位置),然后弹出并推进插入符号:

[2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 12, 122]
#   ^

等等:

[4, 5, 6, 7, 8, 9, 10, 18, 12, 122]
#      ^
[5, 6, 7, 8, 9, 10, 18, 12, 122]
#         ^
[6, 7, 8, 9, 10, 18, 12, 122]
#            ^
[7, 8, 9, 10, 18, 12, 122]
#                 ^
[8, 9, 10, 18, 12, 122]
#                      ^

现在索引指针已经达到了超出范围的点,因此循环终止。但它并没有遍历所有元素:因为每次弹出元素时,它都会一次跳跃两步。

关于循环列表的一些一般性建议:

  

你最好在迭代时修改列表

更好的方法是:

for _ in range(len(numbers)):
    a = numbers.pop(0)
print(numbers)

或,@Matthias提议:

while numbers:
    a = numbers.pop(0)
print(numbers)

由于列表bool(..)为真,因此它至少包含一个元素。所以每次我们检查numbers中是否至少还有一个元素。