python中的模块级垃圾收集

时间:2010-01-19 18:20:31

标签: python garbage-collection

假设我有一个模块mod_x,如下所示:

class X:
  pass

x=X()

现在,假设我有另一个只执行import mod_x的模块,并继续开展业务。在解释器的生命周期中,模块变量x不会被进一步引用。

类实例x是否会在解释器终止时之外的任何时候收集垃圾?

3 个答案:

答案 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