Python中的模块级垃圾回收
假设我有一个模块 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)
的操作,其中字符串变量 a
和 b
分别是 'mod_x'
和 'x'
,这至少和解决停机问题一样困难;-)。("至少"是因为随时可能会动态加载更多代码...!)