Gabriel Genellina wrote: >>>> L = list(n for n in [globals(),locals()]) >>>> L[0] is L[1] > True >>>> L = list(n() for n in [globals,locals]) >>>> L[0] is L[1] > False > > (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 Peter -- http://mail.python.org/mailman/listinfo/python-list