假设我有一个模块 mod_x,如下所示:
class X:
pass
x=X()
现在,假设我有另一个模块,它只执行 import mod_x,并开始其业务。模块变量 x 在解释器的生命周期内不会被进一步引用。
类实例 x 是否会在解释器终止时的任何时候 被垃圾回收?
请您参考如下方法:
不,变量永远不会被垃圾回收(直到进程结束),因为模块对象将保留在 sys.modules['mod_x'] 中并且它将有一个引用到 mod_x.x——引用计数永远不会下降到 0(直到所有模块在程序结束时被删除)并且这不是“循环垃圾”的问题——它是一个完全有效的实时引用,并证明没有人每个人都做(例如)a getattr(sys.modules[a], b) 其中字符串变量 a 和 b 恰好值 'mod_x' 和 'x' 至少与解决停机问题一样困难;-)。 (“至少”,因为随时可能会动态加载更多代码...!-)。
