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