在循环中创build函数
我试图在一个循环内部创build函数,并将它们存储在字典中。 问题是,字典中的所有条目似乎最终映射到最后创build的函数。 代码如下所示:
d = {} def test(**kwargs): for k in kwargs: def f(): print k, kwargs[k] d[k] = f f() test(foo=1, bar=2) print 'should print the same output as before' d['foo']() d['bar']()
这输出:
foo 1 bar 2 should print the same output as before bar 2 bar 2
任何想法为什么?
你遇到了后期绑定的问题 – 每个函数尽可能晚地查找k
(因此,当在test
外调用时,这发生在循环结束之后)。 通过强制早绑定可轻松修复: def f():
def f(k=k):
– 默认值( k=k
的右侧k=k
是参数名称k
的默认值,手k
在k=k
)在def
时间,而不是在call
时间抬头,所以基本上他们是一种专门寻找早期绑定的方式。
如果你担心得到一个额外的论点(因而可能被错误地调用),还有一种更复杂的方法,它把一个闭包作为一个“function工厂”来使用:
def make_f(kwargs, k): def f(): print k, kwargs[k] return f
在你的循环中做f = make_f(kwargs, k)
而不是def
语句。