Skip to main content
 首页 » 编程设计

Python For 循环列表有趣的结果

2025年05月04日15飞鱼

a = [0,1,2,3,4,5] 
for b in a: 
  print ":"+str(b) 
  a.pop(0) 

认为这可以按顺序遍历整个列表及其所有项目,我运行了这段代码并预料到了这一点。

:0 
0 
:1 
1 
:2 
2 
:3 
3 
:4 
4 
:5 
5 

相反,我得到了这个:

:0 
0 
:2 
1 
:4 
2 

现在我明白了为什么会这样,但这是 python 中的错误吗?它不应该仍然遍历所有原始对象而不是当前列表的长度吗?为什么这没有抛出和越界错误? IE:它不应该仍然完成吗:

:0 
0 
:1 
2 
:2 
4 
:3 
Error 
:4 
Error 
:5 
Error 

请您参考如下方法:

这完全是“预期的”和记录在案的行为。当您遍历列表时,您基本上是在遍历内存位置。当您从列表中弹出某些内容时,列表中之后的所有内容都会将 1 个索引移动到更靠近列表开头的位置。因此,您最终会跳过项目。当您到达列表末尾时,迭代停止。

通常在做这样的事情时,你想要遍历列表的副本:

for b in a[:]: 
    ... 

如评论中所述,如果您以相反的顺序遍历列表:

for b in reversed(a): 
    a.pop() 

这是按预期工作的,因为您不断地拉出最后一个元素,因此您没有改变您尚未看到的任何元素在列表中的位置。