Есть ли способ получить текущее количество ссылок объекта в 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 из результата.