调用lambda函数累加自定义函数时内核无报错崩溃重启问题
问题根本原因
你遇到的内核崩溃是无限递归栈溢出导致的,触发原因是Python闭包的「延迟绑定」特性:
- 你在
add_lambdas的循环中定义lambda时,lambda内部引用的f和function并不会在定义时就捕获当前循环迭代的变量值,而是等到lambda实际被调用时才会去取值。 - 当循环结束你拿到返回的
f4时,循环已经执行完毕,此时变量f指向的就是你最后一次迭代生成的lambda本身,变量function指向的是function_list的最后一个元素f2。 - 调用
f4(2,3)时,lambda内部执行f(x,y)就会调用自身,形成无限递归,最终栈溢出触发内核重启。
修复方案
方案1:用默认参数绑定当前迭代值
默认参数会在lambda定义时完成求值,刚好可以规避延迟绑定问题,修改后的函数如下:
def add_lambdas(function_list): f = lambda x, y: 0 # 初始值建议改成0,避免第一次累加None报错 for function in function_list: # 通过默认参数把当前迭代的f和function的值绑定住 f = lambda x, y, f=f, function=function: f(x, y) + function(x, y) return f
方案2:直接生成sum表达式(更简洁无闭包问题)
完全不需要循环迭代构建嵌套lambda,直接一次性生成对所有函数返回值求和的lambda即可:
def add_lambdas(function_list): return lambda x, y: sum(func(x, y) for func in function_list)
验证结果
修改后调用f4(2,3)会正常返回和f3(2,3)一致的结果3,不会再触发内核崩溃。
内容的提问来源于stack exchange,提问作者kanelbolleonsdag
相关产品推荐
相关产品推荐

