Lambda forms and scoping
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Fri Mar 20 09:03:24 EDT 2009
En Fri, 20 Mar 2009 09:28:08 -0300, R. David Murray
<rdmurray at bitdance.com> escribió:
> Benjamin Peterson <benjamin at python.org> wrote:
>> Márcio Faustino <m.faustino <at> gmail.com> writes:
>> >
>> > Executing the example below doesn't produce the expected behavior, but
>> > using the commented code does. Is this normal, or is it a problem with
>> > Python? I've tested it with version 2.6.1 on Windows XP.
> Here's the way I find it useful to think about this:
>
> When your lambda is created in your for loop inside your __init__ method,
> it acquires a pointer to __init__'s local namespace. (That's how I
> understand what "closure" means in this case, though I imagine "closure"
> probably means something slightly different in computer-science-ese :)
Well, some people would say that the function "closes over" part of its
environment, but that's the idea.
> So, when any of those lambdas is executed, they all have a pointer to
> the exact same namespace, that of __init__. And when they are called,
> __init__'s namespace is in whatever state it was left in when __init__
> ended. In this case, that means that 'option' is pointing to the value
> it had at the _end_ of the for loop.
That's a pretty good explanation -- I would just substitute "pointer" by
"reference".
> Hope this helps. I find that thinking in terms of namespaces helps
> me understand how Python works better than any other mental model
> I've come across.
Good to know! The Python execution model *is* based on namespaces - any
other mental model won't be accurate past certain point (although some
people insist...)
--
Gabriel Genellina
More information about the Python-list
mailing list