gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:43:31 26 4
gpt4 key购买 nike

我正在寻找有关为什么我有意外引用计数的解释。是的,我已经知道 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表示从堆栈加载1个位置参数)( test 引用的对象,由 LOAD_NAME 放置在那里)。

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

关于Python sys.getrefcount() 显示意外的第四个引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30143869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com