I struggle with making lambdas work. The code here is example, but it shows my problem well.
lambdas = list()
for i in range(5):
lambdas.append(lambda x:i*i*x)
print lambdas[0](1)
print lambdas[2](1)
This give me 16, but I expect to have different value for different lambda. Why is happening!
In this code:
for i in range(5):
lambdas.append(lambda x:i*i*x)
The value of i
is determined when the function is run. The value of i
when the function is defined is lost.
Use instead:
lambdas = list()
for i in range(5):
lambdas.append(lambda x, i=i : i*i*x)
print lambdas[0](1)
print lambdas[2](1)
This produces:
0
4
This works because, as a special case, the default arguments to a function, as in i=i
above, bind immediately.
i
is 4
when your loop ends so i
is 4 for every lambda
.
If you print i
outside the loop you will see it is 4:
for i in range(5):
lambdas.append(lambda x: i * i * x)
print(i)
4
You are using a variable that is being updated throughout the loop, if you call the lambda inside the loop you would get what you were expecting.
for i in range(5):
lambdas.append(lambda x: i * i * x)
print(lambda x: i * i * x)(1)
0
1
4
9
16
The behaviour is what you would expect, i
is simply a variable like any other.
On a side note you could use a list comp to create your list:
lambdas = [lambda x,i=i: i * i * x for i in xrange(5)]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With