假设我有一个模块mod_x
,如下所示:
class X:
pass
x=X()
现在,假设我有另一个只执行import mod_x
的模块,并继续开展业务。在解释器的生命周期中,模块变量x
不会被进一步引用。
类实例x
是否会在解释器终止时除之外的任何时候收集垃圾?
答案 0 :(得分:3)
只有当某个其他东西在某个时刻执行del mod_x.x
或重新绑定,或者模块本身被完全删除时。
答案 1 :(得分:3)
不,变量永远不会被垃圾收集(直到过程结束),因为模块对象将保留在sys.modules['mod_x']
中,并且它将引用mod_x.x
- 参考count永远不会降到0(直到程序结束时删除所有模块)并且它不是“cyclycal garbage”的问题 - 它是一个完全有效的实时引用,并且证明没有人(例如){{{ 1}}其中字符串变量getattr(sys.modules[a], b)
和a
恰好分别值b
和'mod_x'
至少与解决暂停问题一样困难;-)。 (“至少”因为更多代码可能随时动态加载......! - 。)。
答案 2 :(得分:1)
一旦导入模块,它将在sys.modules
dict中,所以除非从那里删除(虽然这可能不是标准做法)但它不会被垃圾收集。
因此,如果您有理由希望已加载的模块被垃圾回收,则必须弄乱sys.modules
。