[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Problems found while inspecting 2005->2007 debdiffs



Frank Küster <frank@debian.org> wrote:

> To me, that sounds like a very peculiar feature (or rather bug) in
> Python, since it is contrary to to what one expects.

Yes, that's rather... surprising.

> Is it documented?

Yes. And it confirms my guess. This is the "Warning" paragraph at the
end of:

  http://docs.python.org/ref/for.html

,----
| Warning:
| 
|   There is a subtlety when the sequence is being modified by the loop
|   (this can only occur for mutable sequences, i.e. lists). An internal
|   counter is used to keep track of which item is used next, and this is
|   incremented on each iteration. When this counter has reached the
|   length of the sequence the loop terminates. This means that if the
|   suite deletes the current (or a previous) item from the sequence, the
|   next item will be skipped (since it gets the index of the current item
|   which has already been treated). Likewise, if the suite inserts an
|   item in the sequence before the current item, the current item will be
|   treated again the next time through the loop. This can lead to nasty
|   bugs that can be avoided by making a temporary copy using a slice of
|   the whole sequence, e.g.,
| 
|     for x in a[:]:
|         if x < 0: a.remove(x)
`----

-- 
Florent



Reply to: