如何在Python中使用for循环生成多个函数?

时间:2017-07-12 15:36:17

标签: python

我正在尝试使用for循环生成具有不同参数i(见下文)的几个函数,但似乎所有这些函数都使用了i的最后一项。谁能告诉我如何处理这个问题?

这是一个简化的例子。实际上我需要使用不同的参数生成200多个函数。

funs = ()
for i in range(2):
    f = lambda x: x+i
    funs += (f,)

然后事实证明这两个函数做同样的事情:

funs[0](1)

输出:2

funs[1](1)

输出:2

但我希望第一个函数给出1而不是2的结果。

非常感谢你。

2 个答案:

答案 0 :(得分:5)

你必须打破动态绑定到i,例如将2个lambda包装在一起:

f = (lambda p : lambda x: x+p)(i)

这样,就会捕获i的值,并且函数会保留i的副本

除此之外:在tuple funs => funs = ()附加funs = []时,我不会出于性能原因使用{{1}}创建列表

答案 1 :(得分:5)

你得到所有函数相同结果的原因是因为i不是lambdas的本地,而是在外部作用域中定义,并且在调用lambda时访问它 - 而不是在它是定义的。在循环结束时,i的值为1,因此,每次调用lambda函数时都使用1。

Jean-Francois Fabre给出了一个很好的解决方案,但我个人更喜欢这个:

list_ = []
for i in range(2):
    f = lambda x, n=i: x+n
    list_.append(f)