Why doesn't eval of generator expression work with locals?

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Thu Jan 29 16:52:55 EST 2009


En Wed, 28 Jan 2009 18:06:01 -0200, Peter Otten <__peter__ at web.de>  
escribió:
> Gabriel Genellina wrote:
>
>> (I think this has to do with free variables in the "right side" (after
>> the "in" keyword) of a generator expression; they appear to be evaluated
>> when the expression is *defined*, not when is is *used*. By contrast,  
>> free
>> variables in the "left side" appear to be evaluated when the expression  
>> is
>> used.)
>
> Indeed, the right side is evaluated in the enclosing namespace and then
> passed as an argument to the genexpr:
>
>  >>> dis.dis(compile("(x for y in z)", "nofile", "exec"))
>   1           0 LOAD_CONST               0 (<code object <genexpr> at
> 0x2b22b2dcf828, file "nofile", line 1>)
>               3 MAKE_FUNCTION            0
>               6 LOAD_NAME                0 (z)
>               9 GET_ITER
>              10 CALL_FUNCTION            1
>              13 POP_TOP
>              14 LOAD_CONST               1 (None)
>              17 RETURN_VALUE

Yes, this is explained (in not so much detail) in the Language Reference.  
Now I *know* how it works, but still isn't *obvious* to me.

-- 
Gabriel Genellina




More information about the Python-list mailing list