为什么sys.getrefcount()返回的引用计数值远高于预期的2?
调用sys.getrefcount查询整数5引用计数远高于预期的原因
- 核心原因是Python内置的小整数对象池优化机制:为了避免频繁创建销毁常用整数带来的性能损耗,Python解释器启动时会预先创建好-5到256区间内的所有整数实例,存入全局共享的缓存池。这些实例是全局单例,整个解释器运行周期内不会被销毁,所有代码中用到这个区间数值的地方,都会直接引用缓存池里的同一个对象,不会单独创建新实例。
- 你代码中
a1 = 5引用的就是缓存池里已有的整数5对象,除了你自己声明的a1变量、sys.getrefcount传参时产生的临时引用之外,解释器启动过程中加载的内置模块、初始化的各种内部结构、常量里已经有大量地方引用了这个整数5对象,sys.getrefcount会统计该对象的所有引用,33就是所有引用的总和。 - 你预期的输出为2的情况,仅适用于没有其他额外引用的新建对象,比如不在小整数缓存区间的大整数、自定义类实例、可变容器等,示例如下:
import sys a = 10086 print(sys.getrefcount(a)) # 输出为2,符合预期
- 不同Python运行环境下,整数5的引用计数结果会有差异,取决于当前环境中其他组件对该对象的引用总数,出现32、33、34等结果均为正常现象。
内容的提问来源于stack exchange,提问作者meallhour
相关产品推荐
相关产品推荐

