Вопрос проверяет знание внутренней оптимизации CPython для целых чисел, что важно для понимания производительности и поведения операторов сравнения.
В стандартной реализации языка Python, известной как CPython, существует внутренняя оптимизация, называемая кэшированием целых чисел (integer interning или integer caching). Она применяется к небольшому, фиксированному диапазону значений.
CPython предварительно создаёт и хранит в памяти объекты для целых чисел в диапазоне от -5 до 256 включительно. Когда в коде требуется целое число из этого диапазона, интерпретатор не создаёт новый объект, а возвращает ссылку на уже существующий, глобально доступный объект.
Основная цель — оптимизация производительности и потребления памяти. Небольшие целые числа используются чрезвычайно часто (в счётчиках циклов, индексах, простых вычислениях). Без кэширования при каждой операции a = 1 создавался бы новый объект в памяти, что приводило бы к лишним выделениям и очисткам памяти (сборке мусора). Кэширование устраняет эту накладную нагрузку.
Это поведение влияет на сравнение объектов с помощью оператора is, который проверяет, ссылаются ли две переменные на один и тот же объект в памяти.
# Пример с кэшируемыми числами
a = 100
b = 100
print(a is b) # True, потому что обе переменные ссылаются на один кэшированный объект
# Пример с числами вне диапазона
x = 300
y = 300
print(x is y) # Может быть False, если код выполняется в разных контекстах (например, в интерактивной сессии или отдельных строках модуля).
# Для гарантированного сравнения значений всегда используйте ==
print(x == y) # TrueВажно отметить, что это деталь реализации CPython и не гарантируется спецификацией языка. Другие реализации, такие как PyPy или Jython, могут вести себя иначе. Поэтому полагаться на это поведение в логике приложения (например, используя is для сравнения чисел) — плохая практика.
Оптимизация работает полностью автоматически "под капотом" интерпретатора. Как разработчик, вы напрямую не управляете этим процессом, но понимание его помогает:
is при отладке.Вывод: Кэширование целых чисел — это внутренняя оптимизация CPython для повышения производительности. Знание о диапазоне от -5 до 256 полезно для углублённого понимания работы интерпретатора и корректного использования операторов сравнения, но в повседневном кодировании следует всегда использовать == для сравнения числовых значений.