您如何部分应用功能列表?以下最小例子:
def myprint(a,b): print 'a: '+str(a)+', b: '+str(b) l1=[lambda x:myprint('x',x), lambda y:myprint('y',y)] l2=[] for f in l1: l2.append(lambda:f('!')) for g in l2: g()
给出了这个输出:
a: y, b: ! a: y, b: !
(Naively)预计将是
a: x, b: ! a: y, b: !
但是,lambda:f('!')
仅在最后一个循环中执行。然后f
将保留其第一个循环的值,即l1
中的最后一个元素。然后在l2
中的两个不同的 lambda中使用最后一个元素。
我的问题: 你如何使它按预期工作?