Python在迭代器中删除列表元素,,在迭代器中删除列表元


在迭代器中删除列表元素是非常危险的,因为迭代器是直接对列表的数据进行引用

把列表拷贝给迭代器,然后对原列表进行删除操作就没问题了

pos=turtle.move()for each_fish in fish[:]:    if each_fish.move()==pos:        #鱼儿被吃掉        turtle.eat()        fish.remove(each_fish)        print(‘有一条鱼被吃‘)

Python的List的底层是实现是一个PyObject*数组。如果每次增加一个元素都扩张内存的话效率太低,在增加元素的时候所以会有预申请内存。同理删除元素的时候也不是马上就减小内存空间,他会按照一定的策略减小。而这种减小不太好预测。
再加上删除后索引如何调整并没有明确定义。比如一个长度为3的List你删除了第2个那么第三个下标应该是2还是3,等等可能会引发歧义。如果这个时候内存达到了需要减小的条件,迭代器就不太好判断新的索引究竟是多少。
所以Python为了通用性和安全性考虑就禁止在遍历时删除元素了。

Python在迭代器中删除列表元素

评论关闭