Antworten:
Gemäß der Python- Dokumentationsys
enthält das Modul eine Funktion:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
Im Allgemeinen 1 höher als erwartet, da die Objekt-Arg-Temp-Referenz vorhanden ist.
Über das gc
Modul, die Schnittstelle zu den Garbage Collector-Eingeweiden, können Sie aufrufen gc.get_referrers(foo)
, um eine Liste aller Verweise abzurufen foo
.
Daher erhalten len(gc.get_referrers(foo))
Sie die Länge dieser Liste: die Anzahl der Überweiser, nach denen Sie suchen.
Siehe auch die gc
Moduldokumentation .
sys.getrefcount(object)
) ist einfacher als len(gc.get_referrers(foo))
, wenn Sie wirklich nur die Nummer brauchen.
Es gibt gc.get_referrers()
und sys.getrefcount()
. Es ist jedoch schwer zu erkennen, wie sys.getrefcount(X)
der Zweck der traditionellen Referenzzählung erfüllt werden kann. Erwägen:
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)
Dann function(SomeObject)
liefert '7',
sub_function(SomeObject)
liefert '5',
sub_sub_function(SomeObject)
liefert '3' und
sys.getrefcount(SomeObject)
liefert '2'.
Mit anderen Worten: Wenn Sie verwenden sys.getrefcount()
, müssen Sie die Tiefe des Funktionsaufrufs kennen. Zum Beispiel muss gc.get_referrers()
man die Liste der Referrer filtern.
Ich würde vorschlagen, eine manuelle Referenzzählung für Zwecke wie "Isolation bei Änderung" durchzuführen, dh "Klon, wenn an anderer Stelle darauf verwiesen wird".
import ctypes
my_var = 'hello python'
my_var_address = id(my_var)
ctypes.c_long.from_address(my_var_address).value
ctypes verwendet die Adresse der Variablen als Argument. Der Vorteil der Verwendung von ctypes gegenüber sys.getRefCount besteht darin, dass Sie nicht 1 vom Ergebnis abziehen müssen.