[Python-Dev] namespace for generator expressions

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