I figured out the answer to my own query. In the original example (see below), there was only one binding for k, which was shared by all the closures, so they all saw the same value. Consider:

def fie2(k):
    return lambda: fie3(k)

def fie3(m):
    print m

def fie1(j):
    return fie2(j)


l=map(fie1,[1,2,3])

map(lambda f:f(), l)


This prints
1
2
3
because each lambda has its own binding of k.


On Nov 30, 2009, at 7:35 AM, 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





--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to