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

Python中返回的函数可访问哪些数据?wrapper为何能记住外部参数?

Python闭包机制问题解答

首先附上问题中的示例代码:

def add(arg1, arg2):
   return arg1 + arg2

def partial(f, arg1, arg2):
   def wrapper():
      return f(arg1, arg2)
  
   return wrapper

callback = partial(add, 2, 4)
print(callback())

# Output: 6

问题1:wrapper函数为什么可以记住arg1和arg2的值?

这是Python**闭包(Closure)**特性的典型表现:作为定义在外部函数partial内部的嵌套函数,wrapper引用了partial作用域内的非局部变量f、arg1、arg2,这些被引用的变量会和wrapper绑定,不会因为partial函数执行完成、退出作用域就被销毁。

问题2:执行return wrapper语句时实际返回的内容是什么?

返回的是一个闭包实例,而非单纯的函数可执行代码。它除了包含wrapper本身的运行逻辑外,还封装了wrapper捕获的所有自由变量的上下文绑定关系,也就是你提到的上下文环境。你可以直接打印callback验证,输出会明确显示它是partial内部定义的wrapper函数对象。

问题3:该机制的底层逻辑是什么?

Python中所有函数对象都内置了__closure__属性:

  • 普通无捕获的函数,__closure__值为None
  • 闭包函数的__closure__会返回一个元组,元组内每个元素都是cell类型对象,对应存储一个被捕获的自由变量的值
    你可以执行print([cell.cell_contents for cell in callback.__closure__])验证,输出结果为[<function add at 内存地址>, 2, 4],正好是示例中被捕获的三个变量的值。
    另外Python垃圾回收采用引用计数机制:partial执行结束后,原本它的局部变量f、arg1、arg2的引用计数会归零被回收,但因为wrapper的__closure__属性引用了这三个变量,它们的引用计数不为0,因此会一直留存到闭包实例callback被销毁为止,所以调用callback时不会触发NameError。

内容的提问来源于stack exchange,提问作者ToTheSpace 2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:27:04