#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 имело бы смысл поддерживать их в виде словарей. Таким образом, любое выражение, выдающее целое число (и, возможно, даже с плавающей запятой) и строки (по крайней мере, достаточно короткие строки), будет хэшироваться, просматриваться в соответствующем (внутреннем) словаре объектов, добавляться при необходимости и затем возвращаться в виде ссылок на результирующий объект.
Вы можете выполнить собственное аналогичное интернирование любых пользовательских объектов, которые вам нравятся, обернув создание экземпляра в ваши собственные вызовы вашего собственного статического словаря класса.