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
相关产品推荐
相关产品推荐

