在迭代器中删除列表元素是非常危险的,因为迭代器是直接对列表的数据进行引用
把列表拷贝给迭代器,然后对原列表进行删除操作就没问题了
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为了通用性和安全性考虑就禁止在遍历时删除元素了。
时间: 2024-10-24 11:41:37