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

时间:2009-02-04 07:32:51

标签: python refcounting

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

4 个答案:

答案 0 :(得分:80)

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

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

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

答案 1 :(得分:56)

使用gc模块(垃圾收集器内核的界面),您可以致电gc.get_referrers(foo)以获取引用foo的所有内容的列表。

因此,len(gc.get_referrers(foo))将为您提供该列表的长度:引荐来源的数量,这是您所追求的。

另请参阅gc module documentation

答案 2 :(得分:7)

gc.get_referrers()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)

然后function(SomeObject)发送' 7',
sub_function(SomeObject)发送' 5',
sub_sub_function(SomeObject)发送'和 sys.getrefcount(SomeObject)发送了' 2'。

换句话说:如果使用sys.getrefcount(),则必须了解函数调用深度。对于gc.get_referrers(),可能必须过滤引荐列表。

我建议将手动引用计数用于诸如“隔离更改”之类的目的,即“如果在别处引用则克隆”。

答案 3 :(得分:0)

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。