2009-02-04 21 views

Respuesta

42

Con el módulo de gc, la interfaz con las agallas recolector de basura, puede llamar gc.get_referrers(foo) para obtener una lista de todo lo referente a foo.

Por lo tanto, len(gc.get_referrers(foo)) le dará la longitud de esa lista: el número de referencias, que es lo que está buscando.

Véase también el gc module documentation.

+7

También se debe mencionar que el conteo será +1, ya que la lista de gc se refiere también al objeto. –

+1

Creo @ Dan que la respuesta es correcta: >>> import gc >>> bar de clase(): ... pasar ... >>> b = Bar() >>> len (gc.get_referrers (b)) >>> gc.get_referrers (b) [{'b': <__ main__.Bar instance at 0x7f1f010d0e18>, 'Bar': , '__builtins__': , '__package__': None, 'gc': , '__name__': '__main__', '__doc__': Ninguno}] – Havok

+0

@ tehvan's answer ('sys.getrefcount (object)') es más sencillo que 'len (gc.get_referrers (foo))', si realmente solo necesitas el número. – moi

55

De acuerdo con el pitón documentation, el módulo sys contiene una función:

import sys 
sys.getrefcount(object) #-- Returns the reference count of the object. 

Generalmente 1 más alta que se podría esperar, debido a objeto arg referencia temporal.

+0

Enlace a la documentación oficial: https://docs.python.org/2/library/sys.html#sys.getrefcount – moi

3

Hay gc.get_referrers() y sys.getrefcount(). Pero, es un poco difícil ver cómo el sys.getrefcount(X) podría servir para el propósito del conteo tradicional de referencias. 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) 

Entonces 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 usa sys.getrefcount(), debe tener en cuenta la profundidad de llamada de la función. Para gc.get_referrers() uno podría tener que filtrar la lista de referencias.

Propongo hacer recuento manual de referencia para fines tales como "aislamiento en el cambio", es decir, "clonar si se hace referencia en otro lugar".

Cuestiones relacionadas