在循环中创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的默认值,手kk=k )在def时间,而不是在call时间抬头,所以基本上他们是一种专门寻找早期绑定的方式。

如果你担心得到一个额外的论点(因而可能被错误地调用),还有一种更复杂的方法,它把一个闭包作为一个“function工厂”来使用:

  def make_f(kwargs, k): def f(): print k, kwargs[k] return f 

在你的循环中做f = make_f(kwargs, k)而不是def语句。