为什么Python Ref Counts对小整数的意外高?

9 python reference-counting python-3.x

这个答案中,我找到了一种在Python中获取对象引用计数的方法.

他们提到使用sys.getrefcount().我尝试过,但是我得到了意想不到的结果.当有1个引用时,似乎计数为20.为什么会这样?

我查看了文档,但似乎没有解释原因.

在此输入图像描述

use*_*ica 6

该对象恰好在第一次sys.getrefcount调用时有20个引用它.它不仅仅是你创建的参考文献; 在其他模块和Python内部中有各种其他引用,因为(这是一个实现细节)Python的标准实现只创建一个100对象并将其用于100Python程序中的所有事件.


Cha*_*iam 5

有许多原因可以对对象进行多次引用.追踪哪一个可能很难,并决定它是否值得,可能会绕过你的兴趣水平.引用计数是调试应用程序和python变体的开发人员的主要兴趣.

  • Python试图只为每个引用保留一个实际值.因此,您的示例中的100将是与递归调用的内部限制相同的100或与当前循环索引相同的100.
  • Python保留了对一些常见对象的额外引用,包括低整数.引用计数为1,234,567与计数不同为20.
  • 许多函数会记住并保留对最近参数的引用.
  • 一些解释器保留对最近行引用的最近值和值的引用.例如,先前的返回值存储在"_"中.这意味着在解释器中运行并从命令行运行将给出不同的答案.
  • 像所有引用计数方案一样,存在错误.例如,PyTuple_GetItem()有一些可疑的选择.

PyPi与C-Python与IPython相比,这些计数的确切参考计数和含义将有所不同.引用计数很少是在Python中查找奇怪行为的好工具.