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