Python sys.getrefcount() 显示意外的第 4 个引用
Python sys.getrefcount() shows unexpected 4th reference
我正在寻找关于为什么我有意外引用计数的解释。是的,我已经知道 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
堆栈是第 4 个引用。
为了将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
表示从堆栈加载1个位置参数) =31=]next 在堆栈上([=17= 引用的对象],由 LOAD_NAME
放在那里)。
这与 sys.getrefcount()
调用添加额外引用的原因完全相同;在调用函数之前,也必须首先将对象添加到堆栈中。
我正在寻找关于为什么我有意外引用计数的解释。是的,我已经知道 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
堆栈是第 4 个引用。
为了将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
表示从堆栈加载1个位置参数) =31=]next 在堆栈上([=17= 引用的对象],由 LOAD_NAME
放在那里)。
这与 sys.getrefcount()
调用添加额外引用的原因完全相同;在调用函数之前,也必须首先将对象添加到堆栈中。