lambda trouble

Gandalf gandalf at geochemsource.com
Fri Mar 19 18:30:37 CET 2004


Darabos Daniel wrote:

>And it surprised me a little. I was expecting to see 0, 1, 2, 3, 4.
>After some brainwork I now kind of understand what happens and I even
>found a solution like this:
>
Well, it is not suprising. In a lambda expression, everything after the 
: is symbolic. It is compiled,
not evaluated. You can use a named function instead of an unnamed one:

[GCC 3.3.3 [FreeBSD] 20031106] on freebsd5
Type "help", "copyright", "credits" or "license" for more information.
 >>> def p(x):
... print x
...
 >>> l = []
 >>> for i in range( 5 ):
... def func():
... p(i)
... l.append( func )
...
 >>> for k in l:
... k()
...
 >>> l
[<function func at 0x81a4f0c>, <function func at 0x81a4f44>, <function 
func at 0x81a4f7c>, <function func at 0x81a4fb4>, <function func at 
0x81ae02c>]
 >>>

You have different functions. However, in every function, the name 'i' 
is not a local name. (Python has only two levels: local and global.)
Here is another solution. However, it uses eval. Probably, it is not the 
fastest one.

def p(x):
print x

l = []
for i in range( 5 ):
l.append(eval("lambda: p( %s )"%i))

for k in l:
k()


Udv,

Laci





More information about the Python-list mailing list