116

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

4

5 回答 5

127

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

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

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

于 2009-02-04T07:39:03.833 回答
74

使用gc模块,垃圾收集器的接口,您可以调用gc.get_referrers(foo)以获取所有引用的列表foo

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

另请参阅gc模块文档

于 2009-02-04T07:36:25.477 回答
9

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)交付'3',
sys.getrefcount(SomeObject)交付'2'。

换句话说:如果你使用sys.getrefcount()你必须知道函数调用的深度。对于gc.get_referrers()一个可能必须过滤推荐人列表。

我建议为诸如“更改隔离”之类的目的进行手动引用计数,即“如果在其他地方引用则克隆”。

于 2016-12-10T23:00:21.247 回答
6
import ctypes

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

ctypes.c_long.from_address(my_var_address).value

ctypes将变量的地址作为参数。使用ctypesover的优点sys.getRefCount是您不需要从结果中减去 1。

于 2019-10-21T19:31:46.313 回答
0

Python 中的每个对象都有一个引用计数和一个指向类型的指针。我们可以使用sys 模块获取对象的当前引用计数。您可以使用sys.getrefcount(object)但请记住,将对象传递给 getrefcount() 会使引用计数增加 1

import sys

name = "Steve"

# 2 references, 1 from the name variable and 1 from getrefcount
sys.getrefcount(name)
于 2021-12-03T13:02:25.870 回答