значения id различных переменных в Python 3 - PullRequest
1 голос
/ 08 апреля 2011

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

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

. По обоим подсчетам я получаю значение

505494448

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

1 Ответ

6 голосов
/ 08 апреля 2011

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

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

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

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

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

...