Как устроен под капотом механизм интернирования строк (string interning) и кеширования малых целых чисел (small integer caching) в CPython? В каких случаях оператор is вернет True для одинаковых значений, а в каких — False?

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

Короткий ответ

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

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

Например, две ссылки на один объект дают True, а два независимо созданных равных объекта могут дать False. Компилятор также способен объединять константы, поэтому эксперимент с литералами не доказывает общее правило. sys.intern позволяет явно получить каноническую строку, пока нужные ссылки сохраняются. Проверять числа и строки нужно через ==; is оставляют для идентичности, например value is None. Детали кешей не являются переносимым контрактом Python.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее