Python'da bir nesnenin geçerli ref sayısını almanın bir yolu var mı?


93

Python'da bir nesnenin geçerli ref sayısını almanın bir yolu var mı?

Yanıtlar:



64

gcÇöp toplayıcı bağırsakları arabirimi olan modülü kullanarak, gc.get_referrers(foo)atıfta bulunan her şeyin bir listesini almak için arayabilirsiniz foo.

Bu nedenle, len(gc.get_referrers(foo))size bu listenin uzunluğunu verecektir: yönlendirenlerin sayısı, peşinde olduğunuz şey budur.

Ayrıca gcmodül belgelerine bakın .


7
Ayrıca gc listesi nesneye de atıfta bulunduğundan, sayının +1 olacağı belirtilmelidir.
Richard Levasseur

1
@Dan cevabın doğru olduğunu düşünüyorum: >>> import gc >>> class Bar (): ... pass ... >>> b = Bar () >>> len (gc.get_referrers (b)) 1 >>> gc.get_referrers (b) [{'b': <__ main__.Bar örneği, 0x7f1f010d0e18>, 'Bar': < 0x7f1f010d6530'da sınıf ana .Bar>, ' yerleşikler ': <modül ' yerleşik ' (yerleşik- ) 'de>, ' paket ': Yok, 'gc': <modül 'gc'(built-in)>' adı ':' ana ', ' doc ': Yok}]
Havok

2
@ tehvan'ın cevabı ( sys.getrefcount(object)), len(gc.get_referrers(foo))gerçekten sadece sayıya ihtiyacınız varsa olduğundan daha basittir .
moi

Android'in qpython3'ünde yanlış cevap veriyor. her zaman.
Shihab Shahriar Khan

9

Orada gc.get_referrers()ve sys.getrefcount(). Ancak, sys.getrefcount(X)geleneksel referans sayma amacına nasıl hizmet edebileceğini görmek biraz zor . Düşünmek:

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)

Ardından function(SomeObject)'7',
sub_function(SomeObject)'5',
sub_sub_function(SomeObject)'3' ve
sys.getrefcount(SomeObject)'2' verir.

Başka bir deyişle: Eğer kullanıyorsanız sys.getrefcount(), fonksiyon çağrı derinliğinin farkında olmalısınız. For gc.get_referrers()one yönlendirmeleri listesine filtre gerekebilir.

"Değişiklikte izolasyon", yani "başka bir yerde referans verildiğinde klonla" gibi amaçlar için manuel referans sayımı yapmayı öneririm.


5
import ctypes

my_var = 'hello python'
my_var_address = id(my_var)

ctypes.c_long.from_address(my_var_address).value

ctypes, değişkenin adresini argüman olarak alır. Ctypes kullanmanın sys.getRefCount'a göre avantajı, sonuçtan 1 çıkarmanıza gerek olmamasıdır.


1
Komik olsa da, bu yöntem kullanılmamalıdır: 1) hiç kimse kodu okurken neler olup bittiğini anlamayacaktır 2) CPython uygulama detaylarına bağlıdır: id, nesnenin adresi ve bir PyObject'in tam bellek düzenidir. Gerekirse getrefcount () 'dan sadece 1 çıkarın.
sabah
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.