Skip to main content
 首页 » 编程设计

python之在 python 中初始化 lambda 函数列表

2025年05月04日26wayfarer

我有一个函数元组,我想预加载一些数据。目前我这样做的方式如下。本质上,我列出了新函数,一次一个地向其中添加 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 方法的一个可能的安全特性。