Python中的模块级垃圾回收

2 投票
3 回答
693 浏览
提问于 2025-04-15 18:13

假设我有一个模块 mod_x,内容如下:

class X:
  pass

x=X()

现在,假设我有另一个模块,它只是执行 import mod_x,然后继续做它的事情。在这个过程中,模块里的变量 x 不会再被引用。

那么,这个类的实例 x 会在解释器运行期间的任何时候被垃圾回收吗?除了在解释器结束时?

3 个回答

1

一旦你导入了一个模块,它就会被放进一个叫做 sys.modules 的字典里。除非你把它从这个字典里移除(虽然可以这样做,但这不是常规做法),否则它就不会被垃圾回收。

所以,如果你有理由想要让一个已经加载的模块被垃圾回收,你就得去动手改动 sys.modules 这个字典。

3

只有在其他地方执行了 del mod_x.x 这个命令,或者重新绑定了某个东西,或者这个模块本身被完全删除的情况下,才会发生这种情况。

4

不,这个变量永远不会被垃圾回收(直到程序结束),因为模块对象会一直保留在 sys.modules['mod_x'] 中,并且它会有一个指向 mod_x.x 的引用——引用计数永远不会降到0(直到程序结束时所有模块都被移除)。这并不是“循环垃圾”的问题——这是一个完全有效的活引用。证明没有人会做类似 getattr(sys.modules[a], b) 的操作,其中字符串变量 ab 分别是 'mod_x''x',这至少和解决停机问题一样困难;-)。("至少"是因为随时可能会动态加载更多代码...!)

撰写回答