有没有办法在 Python 中获取对象的当前引用计数?
5 回答
根据 Python文档,该sys
模块包含一个函数:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
由于对象 arg 临时引用,通常比您预期的高 1。
使用gc
模块,垃圾收集器的接口,您可以调用gc.get_referrers(foo)
以获取所有引用的列表foo
。
因此,len(gc.get_referrers(foo))
将为您提供该列表的长度:推荐人的数量,这就是您所追求的。
另请参阅gc
模块文档。
有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()
一个可能必须过滤推荐人列表。
我建议为诸如“更改隔离”之类的目的进行手动引用计数,即“如果在其他地方引用则克隆”。
import ctypes
my_var = 'hello python'
my_var_address = id(my_var)
ctypes.c_long.from_address(my_var_address).value
ctypes
将变量的地址作为参数。使用ctypes
over的优点sys.getRefCount
是您不需要从结果中减去 1。
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)