gc.get_referrers返回结果与预期不符的疑问及字典含义咨询
问题解答
那个字典是什么?
这个带__main__键的字典就是当前模块的全局命名空间字典,和你调用globals()得到的对象是同一个。你定义的my_obj、ref_1、ref_2这些变量都存在这个字典里,所以它会作为引用者被返回。
为什么返回数量和sys.getrefcount不一致?
这俩函数统计的维度完全不一样:
sys.getrefcount(my_obj)算的是所有引用的总个数,包括:- 全局命名空间里
my_obj、ref_1、ref_2这3个引用 - 调用
sys.getrefcount时,参数传递生成的临时引用(这就是结果为4的原因)
- 全局命名空间里
gc.get_referrers(my_obj)统计的是持有该对象引用的容器对象,不是单个变量。比如你那三个变量都存在同一个全局字典里,所以这个字典只会被算一次,不会重复统计。另外,函数调用产生的临时引用属于栈上的临时引用,不在GC的追踪范围内,所以也不会被这个函数返回。
文档说明在哪?
Python官方文档的gc模块部分,对get_referrers的说明明确指出:它返回的是直接引用目标对象的容器对象,不包含栈帧中的临时引用。模块的全局命名空间字典属于GC追踪的容器类型,因此会被列入返回结果。
内容的提问来源于stack exchange,提问作者Kurt Bourbaki
相关产品推荐
相关产品推荐

