我正在寻找有关为什么我有意外引用计数的解释。是的,我已经知道了sys.getrefcount()
将增加预期计数1
。这不是下面发生的事情。
我期待这个功能test(a)
以显示3
not 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
首先并将结果放在堆栈顶部。这是一个参考,就像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
The CALL_FUNCTION opcode从堆栈加载参数(1
这里的意思是从堆栈加载 1 个位置参数) 在调用找到的对象之前next在堆栈上(由test
,放在那儿LOAD_NAME
).
这与为什么sys.getrefcount()
调用添加额外的引用;在调用函数之前,也必须首先将对象添加到堆栈中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)