Python sys.getRefcount()显示出意外的第四参考



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

我希望函数test(a)将显示3不是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

堆栈是第四参考。

为了将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表示 load 中的1个位置参数)在调用堆栈上找到的对象 next 之前(test引用的对象,LOAD_NAME放置)。

这是sys.getrefcount()调用添加额外参考的完全相同的原因;也必须先将对象添加到堆栈中,然后才能调用该函数。

最新更新