Про разницу между is и == в Python
В Python есть два способа сравнения: == и is. Почему для чисел 5 == 5 и 5 is 5 часто дают True, а для больших чисел вроде 1000 == 1000 — True, но 1000 is 1000 может дать False? Когда нужно использовать is, а когда == ?
2 ответа
== сравнивает значения, is — идентичность: «это буквально один и тот же объект в памяти», а не «два одинаковых».
С маленькими числами интерпретатор хитрит: CPython при старте создаёт объекты для целых от -5 до 256 и переиспользует их. Поэтому 5 is 5 — True: обе пятёрки указывают на один закэшированный объект. 1000 в кэш не входит, и два разных объекта со значением 1000 через is могут дать False. Именно «могут»: это деталь реализации, в одних условиях интерпретатор склеит константы, в других нет. Свежие версии Python на такие сравнения даже ругаются SyntaxWarning.
Отсюда правило: значения сравниваем только через ==. is — для случаев, где важна именно идентичность, а это на практике почти всегда x is None.
Запомните как мантру: is — только с None, всё остальное — ==. Этого правила хватит очень надолго. А фокусы вроде 1000 is 1000 — любимый вопрос на собеседованиях; в реальном коде так писать просто не нужно.