You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Python中Lambda函数闭包延迟绑定导致的结果异常

修复Python Lambda列表推导的延迟绑定问题

原代码如下:

def multipliers():
    return [lambda x: i * x for i in range(3)]

print([m(2) for m in multipliers()])

这段代码实际输出[4, 4, 4]而非预期的[0, 2, 4],核心原因是lambda中的i是闭包引用,不会在定义时立即绑定当前循环的i值。当后续调用这些lambda函数时,循环已经执行完毕,i的最终值是2,所以每个lambda计算的都是2*2=4。

以下是几种可行的修复方案:

方案1:利用默认参数立即绑定值

给lambda添加默认参数i=i,这样在定义lambda时就会把当前循环的i值绑定到参数上,而非依赖闭包引用:

def multipliers():
    return [lambda x, i=i: i * x for i in range(3)]

print([m(2) for m in multipliers()])

方案2:使用functools.partial绑定参数

通过partial提前把i的值绑定到lambda的参数上,避免闭包的延迟绑定问题:

from functools import partial

def multipliers():
    return [partial(lambda i, x: i * x, i) for i in range(3)]

print([m(2) for m in multipliers()])

方案3:用工厂函数创建lambda

通过单独的工厂函数生成lambda,每次调用工厂函数时都会创建新的闭包,捕获当前的i值:

def multiplier_factory(i):
    return lambda x: i * x

def multipliers():
    return [multiplier_factory(i) for i in range(3)]

print([m(2) for m in multipliers()])

内容的提问来源于stack exchange,提问作者Hahan't

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:39:34