问题
Is there a way to get the current ref count of an object in Python?
回答1:
According to the Python documentation, the sys module contains a function:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
Generally 1 higher than you might expect, because of object arg temp reference.
回答2:
Using the gc module, the interface to the garbage collector guts, you can call gc.get_referrers(foo) to get a list of everything referring to foo.
Hence, len(gc.get_referrers(foo)) will give you the length of that list: the number of referrers, which is what you're after.
See also the gc module documentation.
回答3:
There is gc.get_referrers() and sys.getrefcount(). But, It is kind of hard to see how sys.getrefcount(X) could serve the purpose of traditional reference counting. Consider:
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)
Then function(SomeObject) delivers '7', sub_function(SomeObject) delivers '5', sub_sub_function(SomeObject) delivers '3', and sys.getrefcount(SomeObject) delivers '2'.
In other words: If you use sys.getrefcount() you must be aware of the function call depth. For gc.get_referrers() one might have to filter the list of referrers.
I would propose to do manual reference counting for purposes such as “isolation on change”, i.e. “clone if referenced elsewhere”.
回答4:
import ctypes
my_var = 'hello python'
my_var_address = id(my_var)
ctypes.c_long.from_address(my_var_address).value
ctypes takes address of the variable as an argument. The advantage of using ctypes over sys.getRefCount is that you need not subtract 1 from the result.
来源:https://stackoverflow.com/questions/510406/is-there-a-way-to-get-the-current-ref-count-of-an-object-in-python