¿Hay alguna forma de obtener el recuento de referencias actual de un objeto en Python?
Respuestas:
Según la documentación de Python , el sys
módulo contiene una función:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
Generalmente 1 más alto de lo que cabría esperar, debido a la referencia temporal del objeto arg.
Usando el gc
módulo, la interfaz para las tripas del recolector de basura, puede llamar gc.get_referrers(foo)
para obtener una lista de todo lo que se refiere afoo
.
Por lo tanto, len(gc.get_referrers(foo))
le dará la longitud de esa lista: el número de referencias, que es lo que busca.
Consulte también la gc
documentación del módulo .
sys.getrefcount(object)
) es más sencilla que len(gc.get_referrers(foo))
, si realmente solo necesita el número.
Hay gc.get_referrers()
y sys.getrefcount()
. Pero, es un poco difícil ver cómo sys.getrefcount(X)
podría servir al propósito del conteo de referencias tradicional. Considerar:
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)
Luego function(SomeObject)
entrega '7',
sub_function(SomeObject)
entrega '5',
sub_sub_function(SomeObject)
entrega '3' y
sys.getrefcount(SomeObject)
entrega '2'.
En otras palabras: si lo utiliza sys.getrefcount()
, debe conocer la profundidad de la llamada a la función. porgc.get_referrers()
posible que tenga que filtrar la lista de referencias.
Propondría hacer un recuento manual de referencias para propósitos tales como "aislamiento en el cambio", es decir, "clonar si se hace referencia a otra parte".
import ctypes
my_var = 'hello python'
my_var_address = id(my_var)
ctypes.c_long.from_address(my_var_address).value
ctypes toma la dirección de la variable como argumento. La ventaja de usar ctypes sobre sys.getRefCount es que no es necesario restar 1 del resultado.