Подтвердить что ты не робот

Есть ли способ получить текущий счетчик ссылок на объект в Python?

Есть ли способ получить текущее количество ссылок на объект в Python?

4b9b3361

Ответ 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 из результата.