在迭代列表时从列表中删除

在迭代列表时从列表中删除

以下代码:

a = list(range(10))remove = Falsefor b in a:
    if remove:
        a.remove(b)
    remove = not removeprint(a)

产出[0, 2, 3, 5, 6, 8, 9],而不是[0, 2, 4, 6, 8]当使用Python3.2时。

  1. 为什么它输出这些特定的值?
  2. 为什么没有错误来指示底层迭代器正在被修改?
  3. 对于这种行为,机制是否与早期的Python版本发生了变化?

请注意,我并不是在研究这种行为,而是想了解它。


Qyouu
浏览 454回答 3
3回答

白衣染霜花

正如Mikola所解释的那样,您观察到的实际结果是,从列表中删除一个条目会将整个列表移动到一个位置上,从而导致您遗漏元素。但在我看来,更有趣的问题是,为什么python在发生这种情况时不选择生成错误消息。如果您试图修改字典,它确实会产生这样的错误消息。我认为这有两个原因。DIT在内部是复杂的,而列表则不是。列表基本上只是数组。DECT必须在迭代时检测其修改的时间,以避免在DECT的内部结构发生变化时崩溃。一个列表可以在不进行检查的情况下离开,因为它只是确保它的当前索引仍然在范围内。历史上(我不确定现在),python列表是通过使用[]运算符来迭代的。Python会计算List[0]、List[1]、List[2],直到得到IndexError为止。在这种情况下,python在开始之前没有跟踪列表的大小,所以它没有检测列表大小被更改的方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python