Python嵌套函数参数b来源及未显式定义为何a+b运算无报错?
问题解答
1. 参数b的来源
你提到的「内部函数从未定义参数b」是误解,看内部函数的定义行:
def add(b):
这里已经明确定义了add函数的形参为b,后续调用逻辑如下:
- 执行
func = test(4)时,test函数执行完成后会将内部定义的add函数作为返回值赋值给func,此时func本质就是add函数的引用 - 执行
func(4)时,你传入的整数4就是add函数的实参,会直接赋值给形参b,这就是b的来源。
2. 为什么a+b运算不会抛出错误
这是Python闭包和变量查找规则的正常表现:
add函数内的nonlocal a声明,明确告诉解释器当前a不是add的本地变量,需要去外层函数test的作用域中查找- 当
test(4)执行时,test的形参a被赋值为4,test执行完毕返回add函数时,add会捕获并保留外层作用域的a变量,哪怕test已经退出执行,这个a也不会被垃圾回收 - 调用
func(4)时,a是已经被捕获的有效值(执行a += 1后变为5),b是当前调用传入的4,两个变量都有明确的取值,自然不会抛出未定义错误,最终返回计算结果9。
内容的提问来源于stack exchange,提问作者yts61
相关产品推荐
相关产品推荐

