Getting a set of lambda functions
Denis Kasak
denis.kasak2718281828 at gmail.com
Sun May 25 19:28:52 EDT 2008
Scott David Daniels wrote:
> Denis Kasak wrote:
> ...
>>>>> spam = []
>>>>> for i in range(10):
>> ... spam.append(lambda: i)
>>>>> spam[0]()
>> 9
>>>>> spam[1]()
>> 9
>>
>> Manually creating the lambdas and appending them to a list works as
>> expected, naturally; I don't see a good reason why it wouldn't work
>> with a loop. Am I missing something?
>
> Yes, you are missing something: binding time. your anonymous function
> returns the value of "i" in the enclosing scope _at_the_time_of_
> _the function's_execution_. If you follow your previous example with
> 'del i' and then execute any of your spam functions, you'll get an
> "NameError: global name 'i' is not defined".
Ah, the problem was in the subtle misunderstanding of the semantics of
lambda functions on my part. It's much clearer now. Thanks.
> There are a couple of ways to slve your problem:
> (1) use default args to do the binding at the function definition time.
> for i in range(10):
> spam.append(lambda arg=i: arg)
> The lambda expression is normally spelled "lambda i=i: i)", but if you
> don't know the idiom, I find the "i=i" part confuses people.
Indeed. It hasn't occured to me that lambdas could bind the variables
inside them by name. I guess my lambdas are still a little shaky. :-)
--
Denis Kasak
More information about the Python-list
mailing list