我试图使用for循环生成具有不同参数i(见下文)的几个函数,但似乎所有这些函数都使用了i的最后一项.有谁能告诉我如何处理这个?
这是一个简化的例子.我实际上需要使用不同的参数生成200多个函数.
funs = ()
for i in range(2):
f = lambda x: x+i
funs += (f,)
Run Code Online (Sandbox Code Playgroud)
然后事实证明这两个函数做同样的事情:
funs[0](1)
Run Code Online (Sandbox Code Playgroud)
输出:2
funs[1](1)
Run Code Online (Sandbox Code Playgroud)
输出:2
但我希望第一个函数给出1而不是2的结果.
非常感谢你提前.
你必须打破动态绑定i,例如将2个lambdas包装在一起:
f = (lambda p : lambda x: x+p)(i)
Run Code Online (Sandbox Code Playgroud)
这样,i捕获的值,函数保存副本i
旁白:tuple当附加到funs(funs = ()=> funs = [])时,我不会出于性能原因而创建列表
你为所有函数得到相同结果的原因是因为ilambda不是本地的,而是在外部作用域中定义,并且在调用lambda时访问它 - 而不是在定义它时.在循环结束时,值为i1,因此,每次调用lambda函数时使用1.
Jean-Francois Fabre给出了一个很好的解决方案,但我个人更喜欢这个:
list_ = []
for i in range(2):
f = lambda x, n=i: x+n
list_.append(f)
Run Code Online (Sandbox Code Playgroud)