我有一个函数元组,我想预加载一些数据。目前我这样做的方式如下。本质上,我列出了新函数,一次一个地向其中添加 lambda 函数,然后重新转换为一个元组。然而,当我在代码的不同部分使用这些函数时,它们中的每一个都表现得好像它是列表中的最后一个。
def newfuncs(data, funcs):
newfuncs = []
for f in funcs:
newf = lambda x: f(x, data)
newfuncs.append(newf)
return tuple(newfuncs)
这是一个简单的例子
funcs = (lambda x, y: x + y, lambda a, b: a - b)
funcs = newfuncs(10, funcs)
print(funcs[0](5))
print(funcs[1](5))
我希望打印数字 15,然后是 -5。然而,这段代码打印了数字 -5 两次。如果有人可以帮助我理解为什么会发生这种情况,将不胜感激。谢谢!
请您参考如下方法:
如前所述,问题出在变量 f 上,它是分配给 all lambda 函数的同一个变量,所以最后在循环中,每个 lambda 看到相同的 f。
这里的解决方案是使用 functools.partial,或者为 lambda 创建一个作用域默认参数:
def newfuncs(data, funcs):
newfuncs = []
for f in funcs:
newf = lambda x, f=f: f(x, data) # note the f=f bit here
newfuncs.append(newf)
return tuple(newfuncs)
像以前一样调用这些 lambda 现在可以得到:
15
-5
如果您使用的是 python3.x,请确保查看此 comment by ShadowRanger作为作用域默认 arg 方法的一个可能的安全特性。
