Почему у моего типа расширения Python два отсчета ссылок, а не один?

#python #c #python-c-api #refcounting

Вопрос:

Я поддерживаю тип Python, который был создан как расширение Python с использованием API Python C. Мой вопрос касается срока службы этого объекта «NamedArray». По сути, мой тестовый код выглядит так:

     def test_init_from_constructor(self):
        """

        :return:
        """
        n = NamedArray((2, 3))
        self.assertIsInstance(n, NamedArray)
        self.assertEqual(2, sys.getrefcount(n))
 

Моя проблема в том, что количество ссылок для вновь созданного объекта NamedArray равно 2, но я ожидаю, что оно будет равно 1. Откуда взялась другая ссылка ?

Комментарии:

1. Возвращаемое число, как правило, на единицу больше, чем вы могли бы ожидать, поскольку оно включает (временную) ссылку в качестве аргумента getrefcount().

2. А-ха, в этом есть смысл

Ответ №1:

Это задокументировано в разделе sys.getrefcount

sys.getrefcount(object)

Возвращает количество ссылок на объект. Возвращаемое число, как правило, на единицу больше, чем вы могли бы ожидать, поскольку оно включает (временную) ссылку в качестве аргумента getrefcount()

Комментарии:

1. Абдул уже ответил на этот вопрос, но эта онлайн-статья также может быть актуальной. Для примитивных типов, таких как целые числа, у некоторых по умолчанию может быть более 500 ссылок! Строки также имеют большое количество ссылок по умолчанию. groverlab.org/hnbfpr/2017-06-22-fun-with-sys-getrefcount.html