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?

Antworten:



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 .


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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.