C'è un modo per ottenere il conteggio ref corrente di un oggetto in Python?
Risposte:
Secondo la documentazione di Python , il sysmodulo 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 gcmodulo, 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 gcdocumentazione 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.