Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.python > #25168 > unrolled thread
| Started by | Jurko Gospodnetić <jurko.gospodnetic@pke.hr> |
|---|---|
| First post | 2012-07-11 09:01 +0200 |
| Last post | 2012-07-11 09:01 +0200 |
| Articles | 1 — 1 participant |
Back to article view | Back to comp.lang.python
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: lambda in list comprehension acting funny Jurko Gospodnetić <jurko.gospodnetic@pke.hr> - 2012-07-11 09:01 +0200
| From | Jurko Gospodnetić <jurko.gospodnetic@pke.hr> |
|---|---|
| Date | 2012-07-11 09:01 +0200 |
| Subject | Re: lambda in list comprehension acting funny |
| Message-ID | <mailman.2008.1341990101.4697.python-list@python.org> |
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ć
Back to top | Article view | comp.lang.python
csiph-web