значения идентификаторов различных переменных в python 3

#memory #python-3.x

#память #python-3.x

Вопрос:

Я могу понять неизменяемость с помощью python (что тоже удивительно просто). Допустим, я присваиваю число

 x = 42
print(id(x))
print(id(42))
  

В обоих случаях я получаю значение

 505494448
  

Мой вопрос в том, выделяет ли интерпретатор python идентификаторы всем числам, алфавитам, True / False в памяти перед загрузкой среды? Если это не так, то как отслеживаются идентификаторы? Или я неправильно смотрю на это? Кто-нибудь может объяснить это, пожалуйста?

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

1. интернируются небольшие числа от -5 до 255

2. О, это то, чего я не знал .. спасибо, Дэн Д.

Ответ №1:

То, что вы видите, — это деталь реализации (внутренняя оптимизация), вызывающая интернирование. Это метод (используемый реализациями ряда языков, включая Java и Lua), который использует псевдонимы имен или переменных для обозначения отдельных экземпляров объекта, где это возможно или осуществимо.

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

Я слышал, что реализация C Python действительно включает набор из первых ста или около того целых чисел в качестве статически создаваемых неизменяемых объектов. Я подозреваю, что другие библиотеки времени выполнения языка очень высокого уровня, вероятно, будут включать аналогичные оптимизации: первые сто целых чисел очень часто используются большинством нетривиальных фрагментов кода.

С точки зрения того, как такие вещи реализованы … для строк и целых чисел большего размера для Python имело бы смысл поддерживать их в виде словарей. Таким образом, любое выражение, выдающее целое число (и, возможно, даже с плавающей запятой) и строки (по крайней мере, достаточно короткие строки), будет хэшироваться, просматриваться в соответствующем (внутреннем) словаре объектов, добавляться при необходимости и затем возвращаться в виде ссылок на результирующий объект.

Вы можете выполнить собственное аналогичное интернирование любых пользовательских объектов, которые вам нравятся, обернув создание экземпляра в ваши собственные вызовы вашего собственного статического словаря класса.