On 5/6/2010 3:34 PM, Artur Siekielski wrote:
Hello.
I found this strange behaviour of lambdas, closures and list
comprehensions:
funs = [lambda: x for x in range(5)]
[f() for f in funs]
[4, 4, 4, 4, 4]
You succumbed to lambda hypnosis, a common malady ;-).
The above will not work in 3.x, which does not leak comprehension
iteration variables. It is equivalent to
funs = [lambda: x for y in range(5)]
del y # only for 2.x. y is already gone in 3.x
x = 4
[f() for f in funs]
Now, I am sure, you would expect what you got.
and nearly equivalent to
def f(): return x
x=8
funs = [f for x in range(5)]
[f() for f in funs]
# [8,8,8,8,8] in 3.x
Ditto
Terry Jan Reedy
--
http://mail.python.org/mailman/listinfo/python-list