有没有办法在Python中获取对象的当前引用计数?

有没有办法在Python中获取对象的当前引用计数?,python,refcounting,Python,Refcounting,有没有办法在Python中获取对象的当前引用计数?使用gc模块(垃圾收集器guts的接口),您可以调用gc.get\u referers(foo)来获取引用foo的所有内容的列表 因此,len(gc.get\u referers(foo))将为您提供该列表的长度:referers的数量,这就是您所追求的 另请参见。根据Python,sys模块包含一个函数: import sys sys.getrefcount(object) #-- Returns the reference count of

有没有办法在Python中获取对象的当前引用计数?

使用
gc
模块(垃圾收集器guts的接口),您可以调用
gc.get\u referers(foo)
来获取引用
foo
的所有内容的列表

因此,
len(gc.get\u referers(foo))
将为您提供该列表的长度:referers的数量,这就是您所追求的

另请参见。

根据Python,sys模块包含一个函数:

import sys
sys.getrefcount(object) #-- Returns the reference count of the object.

由于对象arg temp引用,通常比您预期的高1

gc.get\u referers()
sys.getrefcount()
。但是,很难看出
sys.getrefcount(X)
如何满足传统引用计数的目的。考虑:

import sys

def function(X):
    sub_function(X)

def sub_function(X):
    sub_sub_function(X)

def sub_sub_function(X):
    print sys.getrefcount(X)
然后
函数(SomeObject)
传递'7',
sub_函数(SomeObject)
提供“5”
sub\u sub\u函数(SomeObject)
提供“3”和
sys.getrefcount(SomeObject)
传递“2”

换句话说:如果使用
sys.getrefcount()
,则必须了解函数调用深度。对于
gc.get\u referers()
,可能需要过滤referers列表

我建议进行手动引用计数,例如“变更时隔离”,即“在其他地方引用时克隆”

import ctypes

my_var = 'hello python'
my_var_address = id(my_var)

ctypes.c_long.from_address(my_var_address).value
ctypes将变量的地址作为参数。
与sys.getRefCount相比,使用ctypes的优点是不需要从结果中减去1。

还应该提到,计数将为+1,因为gc列表也引用了对象。我认为@Dan的答案是正确的:>>>导入gc>>>类栏():。。。通过…>>>b=Bar()>>>len(gc.get_referers(b))1>>>gc.get_referers(b)[{'b':,'Bar':,'builtins':,'package':None,'gc':,'name':'main','doc':None}]@tehvan的答案(
sys.getrefcount(object)
)比
len(gc.get_referers(foo))
,如果你真的只需要这个数字,在Android的qpython3中,它给出了错误的答案。每次。链接到官方文档:虽然很有趣,但不应使用此方法:1)阅读代码时没有人会理解发生了什么2)这取决于CPython的实现细节:id是对象的地址和PyObject的确切内存布局。如果需要,只需从getrefcount()中减去1。