Есть ли способ получить текущее количество ссылок на объект в Python?
Есть ли способ получить текущий счетчик ссылок на объект в Python?
Ответ 1
Согласно документации Python, модуль sys содержит функцию:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
Как правило, на 1 больше, чем вы могли ожидать, из-за ссылки arg temp объекта.
Ответ 2
Используя модуль gc, интерфейс с мусором сборщика мусора, вы можете вызвать gc.get_referrers(foo), чтобы получить список всего, относящийся к foo.
Следовательно, len(gc.get_referrers(foo)) предоставит вам длину этого списка: количество рефериров, что и вы после.
См. также документацию gc.
Ответ 3
Существует 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() может потребоваться отфильтровать список рефереров.
Я бы предложил сделать подсчет ссылок вручную для целей, таких как "изоляция при изменении", т.е. "клонировать, если ссылаться в другом месте".
Ответ 4
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 из результата.