我正在寻找有关为什么我有意外参考计数的解释。是的,我已经知道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()
调用添加额外参考的完全相同的原因;也必须先将对象添加到堆栈中,然后才能调用该函数。