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

Python嵌套类函数变量访问:闭包如何保留外部变量与作用域?

问题

我定义了一个带有自定义__mul__运算符的Value类,在__mul__运算符内部定义了_backward函数,该函数会使用__mul__的参数other变量。

请问当调用out的_backward函数时,Python是如何追踪other变量的?它是否会在内部追踪函数定义时的作用域?


代码示例
class Value:
    
    def __init__(self, data):
        self.data = data
        self.__rmul__ = self.__mul__
        
    def __mul__(self, other):
        out = Value(self.data*other.data)
        
        def _backward():
            print('Backward of ', self.data, other.data)
            
            
        out._backward = _backward
        return out
        
    def __rmul__(self, other):
        self.__mul__(self, other)

a = Value(10)
b = Value(5)

o = a*b

o._backward()

运行输出
Backward of  10 5

解答

这是Python**闭包(Closure)**的特性在起作用:

  • _backward是定义在__mul__函数内部的嵌套函数,它会捕获并保留定义时所在的__mul__作用域中的变量(也就是self和other),即便__mul__已经执行完毕返回,这些变量也不会被垃圾回收。
  • Python会通过闭包的cell对象来追踪这些被捕获的变量。当你调用o._backward()时,_backward函数会访问它定义时所在作用域里的self(对应实例a)和other(对应实例b),而不是调用时的作用域。

简单来说:Python确实会追踪函数定义时的作用域,嵌套函数会“记住”自己诞生时的环境变量,这就是闭包的核心能力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:30:32