Odd closure issue for generators
brian at sweetapp.com
Fri Jun 5 16:36:32 CEST 2009
Ned Deily wrote:
> In article <4A28903B.4020301 at sweetapp.com>,
> Brian Quinlan <brian at sweetapp.com> wrote:
>> Scott David Daniels wrote:
>>> When you evaluate a lambda expression, the default args are evaluated,
>>> but the expression inside the lambda body is not. When you apply that
>>> evaluated lambda expression, the expression inside the lambda body is
>>> is evaluated and returned.
>> But that's not really the issue. I knew that the lambda was not
>> evaluated but thought each generator expression got its own context
>> rather than sharing one.
> Each? Maybe that's a source of confusion. There is only one generator
> expression in your example.
>>>> c = (lambda : i for i in range(11, 16))
> <generator object <genexpr> at 0x114e90>
>>>> d = list(c)
> [<function <lambda> at 0x119348>, <function <lambda> at 0x119390>,
> <function <lambda> at 0x1193d8>, <function <lambda> at 0x119420>,
> <function <lambda> at 0x119468>]
Sorry, I wasn't as precise as I should have been.
If you consider this example:
(<expr> for x in y)
I thought that every time that <expr> was evaluated, it would be done in
a new closure with x bound to the value of x at the time that the
closure was created.
Instead, a new closure is created for the entire generator expression
and x is updated inside that closure.
More information about the Python-list