While playing with closures in list comprehension, I found this:
xs = [1, 2, 3]
fs = [lambda: _ for _ in xs]
vs = [_() for _ in fs]
print vs # [<function <lambda> at 0x020324B0>, <function <lambda> at 0x020D6AB0>, <function <lambda> at 0x020D6AF0>]
print vs[0] # <function <lambda> at 0x020324B0>
print vs[0]() # <function <lambda> at 0x020D6AF0>
print vs[0]()() # <function <lambda> at 0x020D6AF0>
print vs[0]()()() # <function <lambda> at 0x020D6AF0>
Shouldn't vs
containing int
s instead of lambda
s?
But if we use different names in the two list comprehensions it will work as expected:
xs = [1, 2, 3]
fs = [lambda: x for x in xs]
vs = [f() for f in fs]
I tested it in Python2.7.5 and Python2.7.8, both gives the same results. (Python3.4.1 work as expected) Is there an explanation for it or is it a bug?