On 20/09/2013 16:21, Kasper Guldmann wrote:
I was playing around with lambda functions, but I cannot seem to fully grasp
them. I was running the script below in Python 2.7.5, and it doesn't do what
I want it to. Are lambda functions really supposed to work that way. How do
I make it work as I intend?

f = []
for n in range(5):
     f.append( lambda x: x*n )

assert( f[4](2) == 8 )
assert( f[3](3) == 9 )
assert( f[2](2) == 4 )
assert( f[1](8) == 8 )
assert( f[0](2) == 0 )

This is a common gotcha. In the function "lambda x: x*n" n is a global variable, which means that when the function is called it searches globals() for the current value of n, which is 4 (since that was its value when the for loop ended). There are several ways to define functions that depend on the values bound to names at creation time, like you're trying to do. One is to use the fact that default function arguments are evaluated when the function is created. So this will work:

f = []
for n in range(5):
    f.append(lambda x, n = n: x*n)


Another is to use the fact that arguments passed in function calls are evaluated when the function is called. That means that you can define a function which takes a parameter as an argument and returns a function which depends on that parameter to get the desired behaviour, like this:

f = []
for n in range(5):
    f.append((lambda n: lambda x: x*n)(n))
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to