enzo michelangeli schrieb:
Let's suppose I want to create a list of n functions of a single
argument, returning the sum between argument and index in the list, so
that e.g.:
f[0](10) will return 10
f[3](12) will return 15
...and so on. I had naively though of coding:
f = [lambda x: x+j for j in range(n)]
Unfortunately, each function in the list f[]() behaves as a closure,
and f[k](p) does NOT return p+k but p+j (for whatever value j has at
the moment: typically n, the last value assumed by j in the list
comprehension loop).
Is there a way of achieving my goal? (Of course, n is not a constant
known in advance, so I can't manually unroll the loop.)
You need to capture n into the closure of the lambda:
f = [lambda x, n=n: x+j for j in xrange(n)]
Also note the use of xrange instead of range - the latter creates a
list-object while the former only returns a generator. Most of the
times, xrange is thus faster, and also most of the times less memory
consuming (exception to this rule occur for small n, and are neglible)
Diez
--
http://mail.python.org/mailman/listinfo/python-list