迭代lis时出现意外行为

2024-04-20 09:46:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我没想到这会起作用,因为我正在修改被迭代的对象,但我没想到它会以这种方式失败。我真的以为会有例外。你知道吗

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

范围稍大:

>>> x = [1, 2, 3, 4]
>>> for a in x:
...   print a, x.pop(0)
... 
1 1
3 2
>>> x
    [3, 4]

再大一点:

>>> x = [1, 2, 3, 4, 5]
>>> for a in x:
...   print a, x.pop(0)
... 
1 1
3 2
5 3
>>> x
    [4, 5]

这就像for循环从列表中创建一个生成器,但是比较“索引”和列表的长度来决定迭代何时结束。你知道吗

这似乎仍然应该产生一个异常,而不是这种奇怪的行为。有什么原因它不会引发异常吗?


Tags: 对象in列表for方式原因popprint
1条回答
网友
1楼 · 发布于 2024-04-20 09:46:58

正如您直觉所知,for循环在内部使用索引,每次迭代时将其递增1,当索引超过列表长度时停止。这就是如何为列表定义迭代。它是以其他方式为其他类型定义的,您可以通过实现__iter__为自己的类定义它。你知道吗

在遍历列表的同时修改列表是合法的,并且一旦您了解了它的工作原理,就可以预见。删除一个或多个项时,该项之后的项将下移到较低的索引,如果删除的项的索引小于或等于循环的当前索引,则在循环增加索引时将跳过项。你知道吗

有许多解决方案:按相反顺序迭代,对副本进行迭代,列出要删除的索引并分别执行此操作,构建新列表而不是修改现有列表,如果要有条件地删除项,请使用while循环而不是if语句。。。可能还有其他方法。你知道吗

相关问题 更多 >