Czy istnieje sposób, aby uzyskać bieżącą liczbę referencji obiektu w Pythonie?
python
refcounting
GEOCHET
źródło
źródło
Korzystając z
gc
modułu, interfejsu do wnętrzności garbage collectora, możesz zadzwonić,gc.get_referrers(foo)
aby uzyskać listę wszystkiego, do czego się odnosifoo
.W związku z
len(gc.get_referrers(foo))
tym podasz długość tej listy: liczbę odsyłających, czyli to, czego szukasz.Zobacz także
gc
dokumentację modułu .źródło
sys.getrefcount(object)
) jest prostsza niżlen(gc.get_referrers(foo))
, jeśli naprawdę potrzebujesz tylko liczby.Jest
gc.get_referrers()
isys.getrefcount()
. Trudno jednak dostrzec, jaksys.getrefcount(X)
mogłoby służyć tradycyjnemu zliczaniu referencji. Rozważać: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)
Następnie
function(SomeObject)
dostarcza „7”,sub_function(SomeObject)
dostarcza „5”,sub_sub_function(SomeObject)
dostarcza „3” isys.getrefcount(SomeObject)
dostarcza „2”.Innymi słowy: jeśli używasz
sys.getrefcount()
, musisz być świadomy głębokości wywołania funkcji. Byćgc.get_referrers()
może trzeba będzie przefiltrować listę odsyłających.Proponuję ręczne zliczanie odniesień do celów takich jak „izolacja przy zmianie”, tj. „Klonowanie, jeśli odwołanie następuje w innym miejscu”.
źródło
import ctypes my_var = 'hello python' my_var_address = id(my_var) ctypes.c_long.from_address(my_var_address).value
ctypes przyjmuje adres zmiennej jako argument. Zaletą używania ctypes nad sys.getRefCount jest to, że nie musisz odejmować 1 od wyniku.
źródło