Чи є спосіб отримати поточну кількість посилань об’єкта в Python?
Відповіді:
Згідно з документацією на Python , sys
модуль містить функцію:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
Як правило, на 1 вище, ніж можна було очікувати, через посилання на тимчасову аргументацію об'єкта.
За допомогою gc
модуля, інтерфейсу до кишок збирача сміття, ви можете зателефонувати, gc.get_referrers(foo)
щоб отримати список усього, що стосується foo
.
Отже, len(gc.get_referrers(foo))
дасть вам довжину цього списку: кількість рефералів, яку ви шукаєте.
Див. Також gc
документацію до модуля .
sys.getrefcount(object)
) є більш простою, ніж len(gc.get_referrers(foo))
якщо вам дійсно потрібен лише номер.
Є gc.get_referrers()
і sys.getrefcount()
. Але, важко зрозуміти, як це sys.getrefcount(X)
може служити меті традиційного підрахунку посилань. Розглянемо:
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)
Потім function(SomeObject)
доставляє "7",
sub_function(SomeObject)
доставляє "5",
sub_sub_function(SomeObject)
доставляє "3" і
sys.getrefcount(SomeObject)
доставляє "2".
Іншими словами: якщо ви використовуєте, sys.getrefcount()
ви повинні знати про глибину виклику функції. Адже, gc.get_referrers()
можливо, доведеться відфільтрувати список рефералів.
Я б запропонував зробити підрахунок посилань вручну для таких цілей, як «ізоляція від змін», тобто «клон, якщо на нього посилаються деінде».
import ctypes
my_var = 'hello python'
my_var_address = id(my_var)
ctypes.c_long.from_address(my_var_address).value
ctypes приймає адресу змінної як аргумент. Перевага використання ctypes перед sys.getRefCount полягає в тому, що вам не потрібно віднімати 1 від результату.