C'è un modo per ottenere il conteggio ref corrente di un oggetto in Python?
Risposte:
Secondo la documentazione di Python , il sys
modulo contiene una funzione:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
Generalmente 1 maggiore di quanto ci si potrebbe aspettare, a causa del riferimento temporaneo all'argomento dell'oggetto.
Usando il gc
modulo, l'interfaccia per le budella del garbage collector, puoi chiamare gc.get_referrers(foo)
per ottenere un elenco di tutto ciò a cui si riferisce foo
.
Quindi, len(gc.get_referrers(foo))
ti fornirà la lunghezza di quella lista: il numero di referrer, che è quello che stai cercando.
Vedere anche la gc
documentazione del modulo .
sys.getrefcount(object)
) è più semplice di len(gc.get_referrers(foo))
, se hai davvero bisogno solo del numero.
C'è gc.get_referrers()
e sys.getrefcount()
. Ma è un po 'difficile vedere come sys.getrefcount(X)
potrebbe servire allo scopo del tradizionale conteggio dei riferimenti. Prendere in considerazione:
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)
Quindi function(SomeObject)
consegna "7",
sub_function(SomeObject)
"5",
sub_sub_function(SomeObject)
"3" e
sys.getrefcount(SomeObject)
"2".
In altre parole: se si utilizza sys.getrefcount()
è necessario essere consapevoli della profondità della chiamata di funzione. Per gc.get_referrers()
uno potrebbe essere necessario filtrare l'elenco dei referrer.
Proporrei di fare il conteggio manuale dei riferimenti per scopi come "isolamento al cambiamento", cioè "clone se referenziato altrove".
import ctypes
my_var = 'hello python'
my_var_address = id(my_var)
ctypes.c_long.from_address(my_var_address).value
ctypes prende l'indirizzo della variabile come argomento. Il vantaggio dell'utilizzo di ctypes rispetto a sys.getRefCount è che non è necessario sottrarre 1 dal risultato.