Python中将函数重定义为自身偏函数的操作为何不合法?
代码报错原因解析
核心规则:Python函数内部变量的晚绑定机制
Python中所有函数(包括lambda匿名函数)内部引用的非局部变量,只会在函数被调用时才会去对应作用域查找变量的实际值,不会在函数定义阶段就绑定固定的对象。
代码执行流程拆解
你给出的代码执行过程如下:
def f(x): return x # 执行完这一步,作用域内的名字`f`指向一个接收1个参数的普通函数 f = lambda : f(5) # 执行完这一步,名字`f`被重新赋值,指向一个无参的lambda函数 # 注意:lambda内部引用的`f`在这个阶段不会做任何解析,只是记录了需要使用名为`f`的变量 f() # 调用无参lambda,进入lambda内部执行逻辑,此时才会查找`f`对应的对象: # 此时作用域内的`f`已经是lambda本身,相当于尝试调用lambda(5) # lambda本身不接收任何参数,因此抛出参数不匹配的类型错误
验证和修复方案
你感知的循环引用逻辑是对的,本质就是lambda执行时查找到的f已经是自身,和最初定义的普通函数已经没有关系。
如果需要让lambda绑定定义阶段的原f函数,可以利用默认参数定义时绑定的特性修改代码:
def f(x): return x f = lambda f=f: f(5) # 默认参数f会在定义时绑定原普通函数对象 print(f()) # 输出5,符合预期
内容的提问来源于stack exchange,提问作者Eric Auld
相关产品推荐
相关产品推荐

