On Sun, Oct 23, 2016 at 4:08 PM, eryk sun <eryk...@gmail.com> wrote: > For generator expressions, it's about early binding of the outer > iterator. This makes the result of the expression for the outer > iterator behave like a function parameter. Obviously it has to be > evaluated in the defining scope. Comprehensions have adopted the same > behavior, and it's not a bug or a flawed design. However it does need > to be documented better in section 6.2.4.
It may not be flawed design, but it's certainly unintuitive, given the normal explanation: gen = ((x,y) for x in range(y) for y in range(z)) def g(): for x in range(y): for y in range(z): yield (x,y) gen = g() It's actually this, which is definitely unintuitive: def g(it): for x in it: for y in range(z): yield (x,y) gen = g(iter(range(y))) Do you ever see them explained like that? Me neither. So if it's intentional, it needs to be explained somewhere, unless the assumption is that it'll almost never matter. ChrisA -- https://mail.python.org/mailman/listinfo/python-list