为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Qyouu 2019-07-16 10:23:10
在迭代列表时从列表中删除以下代码: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时。为什么它输出这些特定的值?为什么没有错误来指示底层迭代器正在被修改?对于这种行为,机制是否与早期的Python版本发生了变化?请注意,我并不是在研究这种行为,而是想了解它。
查看完整描述

3 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

正如Mikola所解释的那样,您观察到的实际结果是,从列表中删除一个条目会将整个列表移动到一个位置上,从而导致您遗漏元素。

但在我看来,更有趣的问题是,为什么python在发生这种情况时不选择生成错误消息。如果您试图修改字典,它确实会产生这样的错误消息。我认为这有两个原因。

  1. DIT在内部是复杂的,而列表则不是。列表基本上只是数组。DECT必须在迭代时检测其修改的时间,以避免在DECT的内部结构发生变化时崩溃。一个列表可以在不进行检查的情况下离开,因为它只是确保它的当前索引仍然在范围内。

  2. 历史上(我不确定现在),python列表是通过使用[]运算符来迭代的。Python会计算List[0]、List[1]、List[2],直到得到IndexError为止。在这种情况下,python在开始之前没有跟踪列表的大小,所以它没有检测列表大小被更改的方法。


查看完整回答
反对 回复 2019-07-16
  • 3 回答
  • 0 关注
  • 453 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信