闭包变量是否有独立作用域?Python中a_local的生命周期与存储位置问询
闭包变量的作用域与内存相关问题
先附上问题中的代码:
def a_funcs(): class A: def __init__(self): self.a = 0 a_local = A() def set_a(a): a_local.a = a def get_a(): return a_local.a return set_a, get_a set_a, get_a = a_funcs() print(get_a()) set_a(17) print(get_a())
问题1:在a_funcs函数返回后,a_local是否仍存在?它是否仍处于a_funcs的作用域中?垃圾回收器是否会回收a_local?
a_local仍然存在。因为返回的set_a和get_a两个闭包函数都持有对它的引用,Python的垃圾回收机制不会回收被活跃引用指向的对象。- 它不再处于
a_funcs的作用域中。a_funcs执行完毕后,其原局部作用域已经销毁,但闭包会捕获并保留对a_local的引用,让这个对象能在外部通过闭包被访问。 - 垃圾回收器不会回收
a_local,只要set_a或get_a还存在有效引用,a_local就会一直被持有,直到这两个闭包也被销毁。
问题2:从技术层面来讲,a_local存储在栈还是堆上?
Python没有传统编译型语言(如C/C++)那样严格的栈/堆划分:
a_local作为函数局部变量名,在a_funcs执行时会存放在调用栈的帧中,但它只是一个指向堆内存中对象的引用。a_local指向的A类实例对象,以及所有Python中的对象,都统一存储在堆内存里。当a_funcs执行完毕,栈帧被销毁,但堆中的对象因为被闭包引用,所以不会被回收。
内容的提问来源于stack exchange,提问作者habrewning
相关产品推荐
相关产品推荐

