Czy istnieje sposób, aby uzyskać bieżącą liczbę referencji obiektu w Pythonie?
Odpowiedzi:
Według Python dokumentacji The sys
Moduł zawiera funkcję:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
Ogólnie o 1 więcej niż można by się spodziewać, z powodu tymczasowego odniesienia do argumentu obiektu.
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ę odnosi foo
.
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 .
sys.getrefcount(object)
) jest prostsza niż len(gc.get_referrers(foo))
, jeśli naprawdę potrzebujesz tylko liczby.
Jest gc.get_referrers()
i sys.getrefcount()
. Trudno jednak dostrzec, jak sys.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” i
sys.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”.
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.