[Python-Dev] namespace for generator expressions (original) (raw)

Guido van Rossum guido at python.org
Mon Jan 26 23:11:10 EST 2004


> A trivial example is:

Are there non-trivial examples? The PEP suggests that they exist, but doesn't provide any. > iterators = [] > for i in range(5): > iterators.append(x*2 for x in range(i)) > > print map(list,iterators) > > If a listcomp is used, you get: > > [[],[0,],[0,2],[0,2,4],[0,2,4,6],[0,2,4,6,8]] > > If genexprs do late binding, you get: > > [[0,2,4,6,8],[0,2,4,6,8],[0,2,4,6,8],[0,2,4,6,8],[0,2,4,6,8]] Note that Armin Rigo suggested a small change here a few weeks ago that makes the list comp and the gen expr behave the same way.

I may be mistaken, but I had always assumed it should be the way Armin suggested.

The range(i) part of the gen expr is evaluated at the point of definition. The gen expr, thus, translates to:

def f(it): for x in it: yield x * 2 iterators.append(f(range(i)) As a result of this change, the only new scope is for the body of the target expression. I don't know how that effects the earlier examples.

There were definitely examples along the lines of using 'i' in the target expression.

BTW is there good terminology for describing the parts of a list comp or gen expr? How about the iterator, the conditions, and the expression?

Expression is too generic; I suggest target expression.

--Guido van Rossum (home page: http://www.python.org/~guido/)



More information about the Python-Dev mailing list