rbt wrote:
Alan McIntyre wrote:

I think it's because you're modifying the list as you're iterating over it.


One last clarification on this. It's OK to modify the elements of a list, but not the list itself while iterating over it... is that the correct way to think about this?

Correct - the iteration code bases the iteration on the *old* list structure, so you can end up with odd behaviour.


Py> l = range(10)
Py> for i in l: del l[i]
...
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
IndexError: list assignment index out of range
Py> l
[1, 2, 4, 5, 7, 9]

Dictionaries have the same problem, but they include some guards that try to detect it:

Py> d = dict.fromkeys(range(10))
Py> for i in d: del d[i]
...
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
RuntimeError: dictionary changed size during iteration

This feature can't be added to lists because it is possible to iterate sensibly over a mutating list:

Py> l = range(10)
Py> for i in reversed(l): del l[i]
...
Py> l
[]

Cheers,
Nick.

--
Nick Coghlan   |   [EMAIL PROTECTED]   |   Brisbane, Australia
---------------------------------------------------------------
            http://boredomandlaziness.skystorm.net
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to