Python'da bir nesnenin geçerli ref sayısını almanın bir yolu var mı?
Yanıtlar:
Python göre belgeler , sysmodül bir işlev içerir:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
Nesne arg temp referansı nedeniyle genellikle beklediğinizden 1 daha yüksek.
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 .
sys.getrefcount(object)), len(gc.get_referrers(foo))gerçekten sadece sayıya ihtiyacınız varsa olduğundan daha basittir .
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.
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.