嵌套函数中位置参数疑问:inner函数为何能获取外层调用参数?
问题:内部函数inner()如何获取调用f/g时传入的参数?
为何内部函数inner()能获取f和g调用时传入的参数值(即f("y arg")、g("other y arg")中的值)?
在我看来,level_five函数仅定义了一个参数n,并在其内部的变量z赋值中引用了该参数。外层level_five函数从未定义过名为y的参数传递给inner(),那当调用外层函数时,inner()是如何隐式地将传入的值作为自己的y参数的?
我猜测这是因为将函数赋值给f或g时,第一个位置参数已被定义(即该值在调用f或g时传入level_five的参数n),而调用f或g时传入的参数,似乎被当作第二个位置参数,仿佛level_five定义中有隐式的*args,从而传递给inner()……我对此过程感到困惑,能否有人澄清?
示例代码:
x = "global x" def level_five(n): z = f"outer z {n}" def inner(y): return x, y, z return inner def main(): f = level_five(0) g = level_five(1) print(f("y arg"), g("other y arg")) main()
解答
这其实是Python中函数返回函数的基础逻辑,和闭包的变量捕获是两个独立的逻辑:
- 当你调用
level_five(0)时,函数会执行内部逻辑:创建z变量,定义inner(y)函数,然后把inner函数本身返回出来,赋值给f。此时f就是inner函数的引用,和level_five的参数传递已经没有直接关联——level_five的n只是被闭包捕获,用来生成z并保留在inner的作用域里。 - 当你调用
f("y arg"),本质就是在调用inner("y arg"),这里传入的字符串直接对应inner自己定义的y参数,和外层level_five的参数完全无关。
你之前的猜测混淆了两个逻辑:
level_five返回的是inner函数本身,不是绑定了参数的调用结果y是inner自身的参数,不是从level_five隐式传递进来的
换个更直白的类比,这个过程相当于:
# 假设z是已经被闭包捕获好的变量 def inner(y): return x, y, z f = inner # f就是inner函数的别名
所以调用f("y arg")就是给inner的y传值,完全是正常的函数参数传递流程。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

