Python'da bir nesnenin geçerli ref sayısını almanın bir yolu var mı?
Yanıtlar:
Python göre belgeler , sys
modü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 gc
modü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.