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]

Of course I was expecting the list [0, 1, 2, 3, 4] as the result. The
'x' was bound to the final value of 'range(5)' expression for ALL
defined functions. Can you explain this? Is this only counterintuitive
example or an error in CPython?

As others have pointed out you are returning a reference not a value.

You can do what you want by defining a lo cal closure using:

funs = [lambda y = x: y for x in range(5)]

Now you can do

for f in funs:
   print f()

and get the answer you expect.

HTH,

--
Alan Gauld
Author of the Learn to Program web site
http://www.alan-g.me.uk/

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to