You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套函数中位置参数疑问: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:05:01