Python sys.getrefcount() 显示意外的第 4 个引用

Python sys.getrefcount() shows unexpected 4th reference

我正在寻找关于为什么我有意外引用计数的解释。是的,我已经知道 sys.getrefcount() 会将预期计数增加 1。这不是下面发生的事情。

我希望函数 test(a) 显示 3 而不是 4。第 4 个参考来自哪里?

In [2]: import sys

In [3]: a = []

In [4]: sys.getrefcount( a )
Out[4]: 2

In [5]: def test( x ): print "x ref count = {}".format( sys.getrefcount( x ) )

In [6]: test( a )
x ref count = 4

In [7]: sys.getrefcount( a )
Out[7]: 2

堆栈是第 4 个引用。

为了将a的值发送给函数,Python首先计算a并将结果放在栈顶。那是一个引用,就像test()函数中的x变量是一个引用一样。

你可以在字节码中看到这个:

>>> import dis
>>> dis.dis(compile('test( a )', '', 'eval'))
  1           0 LOAD_NAME                0 (test)
              3 LOAD_NAME                1 (a)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE        

CALL_FUNCTION opcode在调用找到的对象之前从堆栈加载参数(这里的1表示从堆栈加载1个位置参数) =31=]next 在堆栈上([=17= 引用的对象],由 LOAD_NAME 放在那里)。

这与 sys.getrefcount() 调用添加额外引用的原因完全相同;在调用函数之前,也必须首先将对象添加到堆栈中。