On May 6, 5:17*am, "Diez B. Roggisch" <de...@nospam.web.dewrote:
wyleu wrote:
I'm trying to supply parameters to a function that is called at a
later time as in the code below:
llist = []
for item in range(5):
* * llist.append(lambda: func(item))
def func(item):
* * print item
for thing in llist:
* * thing()
which produces the result
IDLE 1.2.1
>>================================ RESTART
================================
<function <lambdaat 0xb716356c>
<function <lambdaat 0xb71635a4>
<function <lambdaat 0xb71635dc>
<function <lambdaat 0xb7163614>
<function <lambdaat 0xb716364c>
>>================================ RESTART
================================
4
4
4
4
4
How can one allocate a different parameter to each instance of the
function rather than all of them getting the final value of the loop?
That's a FAQ. Python creates a closure for you that will retain the last
value bound. To prevent that, you need to create a named paramter like
this:
lambda item=item: func(item)
That will bind the current item value at the lambda creation time.
Diez- Hide quoted text -
- Show quoted text -
I am getting lambda creation-time bindings on 2.5.
>>g= [ lambda h= i: h for i in range( 10 ) ]
[ e( ) for e in g ]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>g= [ lambda: i for i in range( 10 ) ]
[ e( ) for e in g ]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]