lambda trouble
Gandalf
gandalf at geochemsource.com
Fri Mar 19 12:30:37 EST 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