Python嵌套函数中外层函数变量生命周期的技术疑问
关于Python闭包变量访问的问题解答
先看你的代码示例:
def make(label): def echo(message): print(label + ':' + message) return echo F = make('Spam') F('Ham!')
执行输出结果:
Spam:Ham!
你的疑问解答:
这是个非常经典的闭包问题,我来给你拆解清楚~
你提到的现象,本质上就是Python里**闭包(Closure)**的核心特性在起作用:
- 当你调用
make('Spam')时,Python会为这个函数调用创建一个局部作用域,里面包含了变量label,值为'Spam'。而echo函数定义在这个局部作用域内,并且引用了外层作用域的label变量。 - 当
make函数执行完毕退出后,它的局部作用域并没有被Python的垃圾回收机制销毁——因为echo函数(也就是你赋值给F的对象)还持有对这个作用域的引用。只有当没有任何对象再引用这个作用域时,它才会被回收。 - 当你调用
F('Ham!')(也就是调用echo函数)时,echo会先在自己的局部作用域查找label,找不到就会去它的外层闭包作用域中查找,而这个作用域里的label依然保留着之前的'Spam'值,所以就能正常输出结果了。
补充验证:闭包保存的是变量引用而非值
为了更直观地说明闭包保存的是变量的引用(不是拷贝的值),可以看下面的例子:
def make(label): def echo(message): print(label + ':' + message) label = 'Updated Spam' # 在make退出前修改label的值 return echo F = make('Spam') F('Ham!') # 输出:Updated Spam:Ham!
这里即使最初传入的label是'Spam',但因为闭包保存的是引用,当make里修改label后,echo调用时会拿到更新后的值。
内容的提问来源于stack exchange,提问作者Pawandeep Singh
相关产品推荐
相关产品推荐

