can this be done without eval/exec?

Schüle Daniel uval at rz.uni-karlsruhe.de
Wed Apr 26 21:24:04 EDT 2006


Hello group,

 >>> lst=[]
 >>> for i in range(10):
...     lst.append(eval("lambda:%i" % i))
...
 >>> lst[0]()
0
 >>> lst[1]()
1
 >>> lst[9]()
9
 >>>

 >>> lst=[]
 >>> for i in range(10):
...     exec "tmp = lambda:%i" % i	# assignment is not expression
...     lst.append(tmp)
...
 >>> lst[0]()
0
 >>> lst[1]()
1
 >>> lst[9]()
9
 >>>

and now the obvious one (as I thought at first)

 >>> lst=[]
 >>> for i in range(10):
...     lst.append(lambda:i)
...
 >>> lst[0]()
9
 >>> i
9
 >>>

I think I understand where the problem comes from
lambda:i seems not to be fully evalutated
it just binds object with name i and not the value of i
thus lst[0]() is not 0

are there other solutions to this problem
without use of eval or exec?

Regards, Daniel



More information about the Python-list mailing list