This surprised me. Python 3.4.2 (default, Oct 8 2014, 10:45:20) [GCC 4.9.1] on linux Type "help", "copyright", "credits" or "license" for more information. >>> y=6 >>> [(x,y) for x in range(y) for y in range(3)] [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2), (3, 0), (3, 1), (3, 2), (4, 0), (4, 1), (4, 2), (5, 0), (5, 1), (5, 2)] >>> [(x,y) for x in range(3) for z in range(y) for y in range(3)] Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 1, in <listcomp> UnboundLocalError: local variable 'y' referenced before assignment
Normally, a comprehension is described as being equivalent to an unrolled loop, inside a nested function. That would be like this: def temp(): ret = [] for x in range(y): for y in range(3): ret.append((x,y)) return ret temp() But it seems that the first iterator (and only that one) is evaluated in the parent context: def temp(iter): ret = [] for x in iter: for y in range(3): ret.append((x, y)) return ret temp(iter(range(y))) Why is this? It seems rather curious. ChrisA -- https://mail.python.org/mailman/listinfo/python-list