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

时间:2015-05-09 19:01:19

标签: python reference-counting

我正在寻找有关为什么我有意外引用计数的解释。是的,我已经知道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

1 个答案:

答案 0 :(得分:1)

堆栈是第4个参考。

为了将a的值发送给函数,Python首先评估a并将结果放在堆栈的顶部。这是一个参考,就像x函数中的test()变量是一个参考。

您可以在字节码中看到:

>>> 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位置参数),然后再调用 next 在堆栈上(test引用的对象,由LOAD_NAME放置)。

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