lambda in list comprehension acting funny

Jurko Gospodnetić jurko.gospodnetic at pke.hr
Wed Jul 11 03:01:18 EDT 2012


   Hi.

>> funcs = [ lambda x: x**i for i in range( 5 ) ]
>> print funcs[0]( 2 )
>>
>> This gives me
>> 16
>>
>> When I was excepting
>> 1
>>
>> Does anyone know why?

   Just the way Python lambda expressions bind their variable 
references. Inner 'i' references the outer scope's 'i' variable and not 
its value 'at the time the lambda got defined'.


> And more importantly, what's the simplest way to achieve the latter? :)

   Try giving the lambda a default parameter (they get calculated and 
have their value stored at the time the lambda is defined) like this:
   funcs = [ lambda x, i=i: x**i for i in range( 5 ) ]


   Hope this helps.

   Best regards,
     Jurko Gospodnetić




More information about the Python-list mailing list