is проверяет идентичность объектов, а не равенство значений. CPython переиспользует малые целые и некоторые интернированные строки, но результат для одинаковых значений зависит от их создания.
Как устроен под капотом механизм интернирования строк (string interning) и кеширования малых целых чисел (small integer caching) в CPython? В каких случаях оператор is вернет True для одинаковых значений, а в каких — False?
is проверяет идентичность объектов, а не равенство значений. CPython переиспользует малые целые и некоторые интернированные строки, но результат для одинаковых значений зависит от их создания.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
is проверяет идентичность объектов, а не равенство значений. CPython переиспользует малые целые и некоторые интернированные строки, но результат для одинаковых значений зависит от их создания.
Например, две ссылки на один объект дают True, а два независимо созданных равных объекта могут дать False. Компилятор также способен объединять константы, поэтому эксперимент с литералами не доказывает общее правило. sys.intern позволяет явно получить каноническую строку, пока нужные ссылки сохраняются. Проверять числа и строки нужно через ==; is оставляют для идентичности, например value is None. Детали кешей не являются переносимым контрактом Python.