¿Hay alguna forma de obtener el recuento de referencias actual de un objeto en Python?
python
refcounting
GEOCHET
fuente
fuente
Usando el
gc
módulo, la interfaz para las tripas del recolector de basura, puede llamargc.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 .fuente
sys.getrefcount(object)
) es más sencilla quelen(gc.get_referrers(foo))
, si realmente solo necesita el número.Hay
gc.get_referrers()
ysys.getrefcount()
. Pero, es un poco difícil ver cómosys.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' ysys.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".
fuente
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.
fuente