I would like to know what\'s the general behaviour of an iterator if the underlaying object changes during the iteration.
Using a simple mutable list, it seems obvi
There's a comment on that particular issue in PEP 234 (Iterators):
Once a particular iterator object has raised StopIteration, will it also raise StopIteration on all subsequent next() calls?
Some say that it would be useful to require this, others say that it is useful to leave this open to individual iterators. Note that this may require an additional state bit for some iterator implementations (e.g. function-wrapping iterators).
Resolution: once StopIteration is raised, calling it.next() continues to raise StopIteration.
Note: this was in fact not implemented in Python 2.2; there are many cases where an iterator's next() method can raise StopIteration on one call but not on the next. This has been remedied in Python 2.3.
There are three typical behaviours of changing an object while iterating over it:
In other words: the actual behaviour is undefined.
Changing objects while iterating over them was such a common problem that in Python 3 the types set
and dict
(and possibly others) were changed to immediately raise an error if additions or removals were detected during iteration.
There are some iterators that can yield more data even after a StopIteration
has been raised; such iterators are considered broken.
This does not mean the iterator is at fault -- it means that if you use such an iterator without caution you can end up with bugs and broken code.