>>> 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 ) ]
Thanks a lot!

I worked around it by

def p(i):

return lambda x: x**i

funcs = [ p(i) for i in range(5) ]

But your variant is nicer (matter of taste of course).

Cheers,

Daniel

--

Psss, psss, put it down! -

http://www.cafepress.com/putitdown