lambda functions within list comprehensions

Max Rybinsky sunspire at gmail.com
Sat Oct 29 17:25:24 EDT 2005


Hello!

Please take a look at the example.

>>> a = [(x, y) for x, y in map(None, range(10), range(10))] # Just a list of tuples
>>> a
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8,
8), (9, 9)]

Now i want to get a list of functions x*y/n, for each (x, y) in a:

>>> funcs = [lambda n: x * y / n for x, y in a]

It looks consistent!

>>> funcs
[<function <lambda> at 0x010F3DF0>, <function <lambda> at 0x010F7CF0>,
<function <lambda> at 0x010F7730>, <function <lambda> at 0x010FD270>,
<function <lambda> at 0x010FD0B0>, <function <lambda> at 0x010FD5B0>,
<function <lambda> at 0x010FD570>, <function <lambda> at 0x010FD630>,
<function <lambda> at 0x01100270>, <function <lambda> at 0x011002B0>]

...and functions are likely to be different.

>>> funcs[0](1)
81

But they aren't!

>>> for func in funcs:
... print func(1)
...
81
81
81
81
81
81
81
81
81
81

It seems, all functions have x and y set to 9.
What's wrong with it? Is it a bug?

On the other hand, this problem has a solution:

>>> def buldFunc(x, y):
... return lambda n: x * y / n
...
>>> funcs = [buldFunc(x, y) for x, y in a]

... and it does work!

But why not to save several lines of code? ;)

Thanks in advance.




More information about the Python-list mailing list