Я работаю над презентацией для коллег, чтобы объяснить основное поведение и аргументацию за GIL, и нашел то, что я не мог объяснить, собрав краткое объяснение подсчета ссылок. Похоже, что новые объявленные переменные имеют четыре ссылки, а не ту, которую я ожидал бы. Например, следующий код:
the_var = 'Hello World!'
print('Var created: {} references'.format(sys.getrefcount(the_var)))
Результаты этого вывода:
Var created: 4 references
Я подтвердил, что вывод был таким же, если я использовал целое число > 100 (< 100 предварительно создано и имеет большее количество ссылок) или float, и если я объявил переменную в пределах области действия или в петля. Результат был тот же. Поведение также, по-видимому, одинаково в 2.7.11 и 3.5.1.
Я попытался отлаживать sys.getrefcount, чтобы узнать, не создает ли он дополнительные ссылки, но не смог войти в функцию (я предполагаю, что это прямой удар до уровня C).
Я знаю, что я собираюсь получить хотя бы один вопрос об этом, когда я представляю, и в любом случае я действительно озадачен выходом. Может ли кто-нибудь объяснить это поведение мне?