#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