在迭代列表时从列表中删除以下代码: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个赞
DIT在内部是复杂的,而列表则不是。列表基本上只是数组。DECT必须在迭代时检测其修改的时间,以避免在DECT的内部结构发生变化时崩溃。一个列表可以在不进行检查的情况下离开,因为它只是确保它的当前索引仍然在范围内。 历史上(我不确定现在),python列表是通过使用[]运算符来迭代的。Python会计算List[0]、List[1]、List[2],直到得到IndexError为止。在这种情况下,python在开始之前没有跟踪列表的大小,所以它没有检测列表大小被更改的方法。
添加回答
举报
0/150
提交
取消