我正在使用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 :(得分: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