Apakah ada cara untuk mendapatkan hitungan ref saat ini dari suatu objek dengan Python?
Jawaban:
Menurut dokumentasi Python , sys
modul 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 gc
modul, 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 gc
dokumentasi 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.