Python lambda函数报错:缺少必需位置参数,期望输出1、4、9
修复Lambda闭包错误,得到期望输出1、4、9
问题分析
原代码存在两个核心问题:
- 内部
lambda额外定义了参数j,导致调用f1()时必须传参,直接触发TypeError; - 即使去掉lambda的参数,Python闭包的延迟绑定特性会让所有lambda共享同一个变量引用,最终全部返回最后一个值的平方(9)。
修复方案
方案1:利用函数默认参数绑定当前值
修改嵌套函数中的lambda,用默认参数在定义时就绑定当前的j值:
def count_lambda(): def f(j): return lambda j=j: j*j # 默认参数在lambda定义时绑定当前j的数值 return [f(i) for i in range(1,4)] f1, f2, f3 = count_lambda() print(f1(), f2(), f3()) # 输出:1 4 9
方案2:使用functools.partial绑定参数
借助partial提前把参数绑定到lambda上,避免闭包延迟绑定的问题:
from functools import partial def count_lambda(): def f(j): return partial(lambda x: x*x, j) return [f(i) for i in range(1,4)] f1, f2, f3 = count_lambda() print(f1(), f2(), f3()) # 输出:1 4 9
方案3:简化嵌套结构,直接绑定列表推导中的变量
去掉多余的嵌套函数f,直接在列表推导里用默认参数绑定当前i:
def count_lambda(): return [lambda x=i: x*x for i in range(1,4)] f1, f2, f3 = count_lambda() print(f1(), f2(), f3()) # 输出:1 4 9
关键说明
- 原代码的直接报错是因为lambda要求传参,所以首先要去掉lambda的参数定义,或通过默认参数/partial提前绑定值;
- Python闭包中的变量是引用绑定而非值绑定,只有在调用lambda时才会查找变量的当前值,因此必须通过默认参数、partial等方式在定义时就固定变量的数值。
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

