为什么我在python中从pop()函数获得不同的输出

时间:2015-11-02 01:48:01

标签: python

我正在使用python 2.7。我试图使用pop函数模拟从列表中弹出元素。但是我得到了一个不一致的结果。

使用变量列表的代码

list_pop = [1,2,3]
for x in list_pop:
    print list_pop
    y = list_pop.pop(0)
    print y

结果:

[1, 2, 3]
1
[2, 3]
2

不使用变量来保存列表的代码

list_pop = [1,2,3]
for x in [1,2,3]:
    print list_pop
    y = list_pop.pop(0)
    print y

[1, 2, 3]
1
[2, 3]
2
[3]
3
  • 我尝试从列表中弹出索引0,其中包含一个正在运行的元素。我想知道为什么我的第一个代码在2号后停止打印但是当我打印list_pop它给出[3]时,第一个代码应该仍然遍历它并打印3.我期望两个代码都有相同的结果。我在这里错过了什么?

3 个答案:

答案 0 :(得分:3)

在第一种情况下,你在修改它时迭代列表,这几乎肯定会给你带来意想不到的结果。

在第二种情况下,您没有迭代正在更改的相同列表,因此结果是固定的迭代次数。

如果你想做第一个并检查所有元素,while循环可能会更好。

while not len(list_pop) == 0:
    print list_pop
    y = list_pop.pop(0)
    print y

另一种方法是制作列表的副本并迭代副本:

for x in list_pop[:]:
    print list_pop
    y = list_pop.pop(0)
    print y

答案 1 :(得分:2)

遵循的一般规则是不应修改要迭代的列表。这正是您应该获得的行为:您迭代的列表变得越来越小,因此循环将迭代的项目越来越少。它不会迭代原始列表,它会遍历当前列表。

在第二个示例中,您将迭代一个永不改变的列表,因此您可以获得三次迭代。

您可能想看一下这个问题:Remove items from a list while iterating

答案 2 :(得分:2)

循环浏览时不应修改列表。这就是结果不一致的原因。相反,您可以使用while循环并将列表清空:

while list_pop:
    print list_pop
    y = list_pop.pop(0)
    print y