如何修复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
相关产品推荐
相关产品推荐

