Есть ли способ получить текущее количество ссылок объекта в Python?
python
refcounting
ГЕОЧЕТ
источник
источник
Используя
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 из результата.
источник