Early halt for iterating a_list and iter(a_list)

Lie Lie.1296 at gmail.com
Fri Aug 15 10:36:54 EDT 2008


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]

[1]
1 1 1
1 1 2
... a very long result ...
3 4 4
3 4 5

[2]
1 1 1
1 1 2
1 1 3
1 1 4
1 1 5

Why is this behavior? Or is it a bug?

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.

A similar behavior also exist in list comprehension.
>>> a, b, c = [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]
>>> [[[(a_, b_, c_) for a_ in a] for b_ in b] for c_ in c]
[[[(1, 1, 1), (2, 1, 1),  ... result snipped ... , (3, 5, 6), (4, 5,
6)]]]

>>> a, b, c = [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]
>>> a, b, c = iter(a), b, iter(c)
>>> [[[(a_, b_, c_) for a_ in a] for b_ in b] for c_ in c]
[[[(1, 1, 1), (2, 1, 1), (3, 1, 1), (4, 1, 1)], [], [], [], []], [[],
[], [], [], []], [[], [], [], [], []], [[], [], [], [], []], [[], [],
[], [], []], [[], [], [], [], []]]



More information about the Python-list mailing list