有没有一种方法可以获取Python中某个对象的当前引用计数?
Answers:
使用gc
模块(垃圾收集器胆量的接口),您可以调用gc.get_referrers(foo)
以获取所有涉及的列表foo
。
因此,len(gc.get_referrers(foo))
将为您提供该列表的长度:引荐来源网址的数量,这是您所追求的。
另请参阅gc
模块文档。
sys.getrefcount(object)
)比更加简单len(gc.get_referrers(foo))
。
有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将变量的地址作为参数。与sys.getRefCount相比,使用ctypes的优势在于您无需从结果中减去1。