Python嵌套函数调用输出与预期不符,为何实际输出为1?
问题解释:为什么代码输出是1而不是2?
给定代码
def alpha(num, proc): def beta(): print(num) if num == 1: alpha(2, beta) else: proc() def gamma(): pass alpha(1, gamma)
你的推导错误点
你的推导存在两个关键偏差:
- 误以为
alpha(2, beta)中的proc()调用的是当前作用域(alpha(2))里的beta,但实际上proc是传入的参数——也就是第一个alpha(1, gamma)里定义的beta。 - 即便忽略第一个错误,Python闭包的变量采用延迟绑定:闭包内的变量不会在定义时固定值,而是在函数调用时才去对应作用域查找。
实际执行流程
- 调用
alpha(1, gamma):- 在该作用域定义
beta(),它引用当前作用域的num(值为1) - 因为
num == 1,调用alpha(2, beta)——这里传入的beta是当前作用域定义的、绑定了num=1的那个函数
- 在该作用域定义
- 进入
alpha(2, beta):- 在此作用域定义新的
beta(),它引用当前作用域的num(值为2) - 因为
num != 1,执行proc()——这里的proc是上一层传入的、来自alpha(1)的beta,不是当前新定义的beta
- 在此作用域定义新的
- 执行来自
alpha(1)的beta()时,它会回到自己定义时的作用域查找num,也就是alpha(1)里的num=1,所以最终打印1。
验证:如何让输出变为2?
如果要让传入的proc捕获对应作用域的num值,可以通过默认参数提前绑定值:
def alpha(num, proc): # 用默认参数把当前num的值绑定到beta的参数中 def beta(num_val=num): print(num_val) if num == 1: alpha(2, beta) else: proc() def gamma(): pass alpha(1, gamma)
此时alpha(1)中定义的beta会把num=1绑定到默认参数,而如果想让alpha(2)的proc()打印2,需要调整调用逻辑让传入的proc是alpha(2)自己的beta,但这就改变了原代码的执行路径。
内容的提问来源于stack exchange,提问作者MPP
相关产品推荐
相关产品推荐

