problem with lambda / closures

Jussi Piitulainen jpiitula at ling.helsinki.fi
Mon Nov 30 12:39:00 EST 2009


Benjamin Kaplan writes:
> On Monday, November 30, 2009, Louis Steinberg wrote:
> > I have run into what seems to be a major bug, but given my short
> > exposure to Python is probably just a feature:
> >
> > running
> > Python 2.6.4 (r264:75821M, Oct 27 2009, 19:48:32)
> > [GCC 4.0.1 (Apple Inc. build 5493)] on darwin
> >
> > with file foo.py containing:
> >
> > ============================== clip here ============
> > def p(d):
> >     print d
> >
> >
> > l=[ ]
> > for k in [1,2,3]:
> >     l.append(lambda : p(k))
> >
> > for f in l:
> >     f()
> >
> > ============================== clip here ============
> > I get output
> > 3
> > 3
> > 3
> > instead of
> > 1
> > 2
> > 3
> > which I would expect.  Can anyone explain this or give me a
> > workaround?  Thank you
> 
> I don't know if anyone considers python's incomplete implementation
> of closures a "feature" but it's documented so it's not really a bug
> either. I believe there is a trick with default arguments to get
> this to work, but I don't use lambdas enough to remember it.

That trick has been shown in some branch of the present thread.

Here's a non-trick solution, which I saved in file quux.py:

def p(d):
    print d

l=[]
for k in [1,2,3]:
    l.append((lambda k : lambda : p(k))(k))

for f in l:
    f()


Python 2.3.4 (#1, Jul 16 2009, 07:03:37) 
[GCC 3.4.6 20060404 (Red Hat 3.4.6-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import quux
1
2
3
>>> 



More information about the Python-list mailing list