Early halt for iterating a_list and iter(a_list)

Fredrik Lundh fredrik at pythonware.com
Fri Aug 15 10:55:17 EDT 2008


Lie wrote:

> When you've got a nested loop a StopIteration in the Inner Loop would
> break the loop for the outer loop too:
> 
> a, b, c = [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]
> 
> def looper(a, b, c):
>     for a_ in a:
>         for b_ in b:
>             for c_ in c:
>                 print a_, b_, c_
> 
> looper(a, b, c)  # Intended behavior [1]
> a, b, c = iter(a), b, iter(c)  # b is intentionally not iter()-ed
> looper(a, b, c)  # Inner StopIteration prematurely halt outer loop [2]

iterators are once-only objects.  there's nothing left in "c" when you 
enter the inner loop the second time, so nothing is printed.

 >>> a = range(10)
 >>> a = range(5)
 >>> a = iter(a)
 >>> for i in a:
...     print i
...
0
1
2
3
4
 >>> for i in a:
...     print i
...
 >>>

 > This is a potential problem since it is possible that a function that
 > takes an iterable and utilizes multi-level looping could be
 > prematurely halted and possibly left in intermediate state just by
 > passing an iterator.

it's a problem only if you confuse iterators with sequences.

</F>




More information about the Python-list mailing list