Apakah ada cara untuk mendapatkan hitungan ref saat ini dari suatu objek dengan Python?
Jawaban:
Menurut dokumentasi Python , sysmodul berisi sebuah fungsi:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
Umumnya 1 lebih tinggi dari yang Anda harapkan, karena referensi temp temp.
Menggunakan gcmodul, antarmuka ke nyali pengumpul sampah, Anda dapat memanggil gc.get_referrers(foo)untuk mendapatkan daftar semua yang merujuk foo.
Karenanya, len(gc.get_referrers(foo))akan memberi Anda panjang daftar itu: jumlah pengarah, yang Anda cari.
Lihat juga gcdokumentasi modul .
sys.getrefcount(object)) lebih mudah daripada len(gc.get_referrers(foo)), jika Anda benar-benar hanya membutuhkan nomornya.
Ada gc.get_referrers()dan sys.getrefcount(). Tapi, agak sulit untuk melihat bagaimana sys.getrefcount(X)bisa melayani tujuan penghitungan referensi tradisional. Mempertimbangkan:
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)
Kemudian function(SomeObject)berikan '7',
sub_function(SomeObject)berikan '5',
sub_sub_function(SomeObject)berikan '3', dan
sys.getrefcount(SomeObject)berikan '2'.
Dengan kata lain: Jika Anda menggunakan sys.getrefcount()Anda harus menyadari kedalaman panggilan fungsi. Untuk gc.get_referrers()satu mungkin harus memfilter daftar perujuk.
Saya akan mengusulkan untuk melakukan penghitungan referensi manual untuk tujuan seperti "isolasi pada perubahan", yaitu "klon jika direferensikan di tempat lain".
import ctypes
my_var = 'hello python'
my_var_address = id(my_var)
ctypes.c_long.from_address(my_var_address).value
ctypes menggunakan alamat variabel sebagai argumen. Keuntungan menggunakan ctypes dibandingkan sys.getRefCount adalah Anda tidak perlu mengurangi 1 dari hasil.