Gibt es eine Möglichkeit, die aktuelle Ref-Anzahl eines Objekts in Python abzurufen?

87

Gibt es eine Möglichkeit, die aktuelle Ref-Anzahl eines Objekts in Python abzurufen?

GEOCHET
quelle

Antworten:

102

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.

tehvan
quelle
Link zur offiziellen Dokumentation: docs.python.org/2/library/sys.html#sys.getrefcount
Moi
63

Über das gcModul, 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 gcModuldokumentation .

Kquinn
quelle
7
Es sollte auch erwähnt werden, dass die Anzahl +1 beträgt, da sich die gc-Liste auch auf das Objekt bezieht.
Richard Levasseur
1
Ich denke @Dan, dass die Antwort richtig ist: >>> importiere gc >>> Klasse Bar (): ... pass ... >>> b = Bar () >>> len (gc.get_referrers (b)) 1 >>> gc.get_referrers (b) [{'b': <__ main__.Bar-Instanz bei 0x7f1f010d0e18>, 'Bar': <class main .Bar bei 0x7f1f010d6530>, ' builtins ': <module ' builtin ' (built- in)>, ' package ': None, 'gc': <module 'gc' (integriert)>, ' name ': ' main ', ' doc ': None}]
Havok
2
@ tehvans Antwort ( sys.getrefcount(object)) ist einfacher als len(gc.get_referrers(foo)), wenn Sie wirklich nur die Nummer brauchen.
Moi
in qpython3 von Android gibt es eine falsche Antwort. jedes Mal.
Shihab Shahriar Khan
9

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".

Frank-Rene Schäfer
quelle
4
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.

Gautam Vanama
quelle