Why in python
[f() for f in [lambda: d for d in [1,2]]]
gives
[2, 2]
Why result differ from another languages (where result is [1,2] as expected)? There are some reasonable reasons for such non-obvious behavior?
Why in python
[f() for f in [lambda: d for d in [1,2]]]
gives
[2, 2]
Why result differ from another languages (where result is [1,2] as expected)? There are some reasonable reasons for such non-obvious behavior?
In this [lambda d: for d in [1,2]]
what you have is
"Running d
from 1 to 2, give me a function returning the value of d
at the moment when the function is called."
After that list of two functions is constructed, you call [f() for f in that list]
. At the moment the function is called, d in [1,2]
has already completed, and d
has its final value, 2
. So both functions return 2
.
One way to get a different result is to copy d
to a variable for each lambda function you create. The easiest way to do that is:
[f() for f in [lambda x=d: x for d in [1,2]]]
Here each lambda
has its own default value for x
, which is d
at the time the function is created.