parameters to lambda's executed at run time.

castironpi at gmail.com castironpi at gmail.com
Tue May 6 10:55:58 EDT 2008


On May 6, 5:17 am, "Diez B. Roggisch" <de... at nospam.web.de> wrote:
> 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 <lambda> at 0xb716356c>
> > <function <lambda> at 0xb71635a4>
> > <function <lambda> at 0xb71635dc>
> > <function <lambda> at 0xb7163614>
> > <function <lambda> at 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]



More information about the Python-list mailing list