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