В чем разница между оператором присваивания (=) и оператором `is` в Python?

Ответ

Оператор = используется для присваивания значения переменной. Оператор is проверяет идентичность объектов, то есть ссылаются ли две переменные на один и тот же объект в памяти.

Ключевое отличие: is сравнивает адреса в памяти, а оператор == (равенство) сравнивает значения объектов.

Пример:

list_a = [1, 2, 3]
list_b = list_a          # list_b ссылается на тот же объект
list_c = [1, 2, 3]       # Создается новый объект с такими же значениями

print(list_a is list_b)  # True: это один и тот же объект
print(list_a is list_c)  # False: разные объекты в памяти
print(list_a == list_c)  # True: значения объектов равны

Когда использовать is:

  • Для проверки на None (if value is None).
  • Для сравнения с синглтонами, такими как True, False (хотя для булевых проверок часто предпочтительнее ==).

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

Ответ 18+ 🔞

Давай разберём эту дичь, а то народ путается, как последний раз. Смотри, оператор = — это просто присваивание. Взял и засунул значение в переменную, всё. А вот is — это уже проверка на идентичность, то есть смотрят, не одно ли и то же это говно в памяти.

Ключевая разница, ёпта: is тыкает пальцем и спрашивает: «Это один и тот же объект?». А == (равенство) просто сравнивает значения: «А вот эти цифры/буквы внутри одинаковые?».

Пример, чтобы вообще ни у кого вопросов не осталось:

list_a = [1, 2, 3]
list_b = list_a          # list_b теперь тычет в ту же самую память, что и list_a
list_c = [1, 2, 3]       # А тут создаётся СОВЕРШЕННО НОВЫЙ объект, просто с такими же цифрами

print(list_a is list_b)  # True: это один и тот же объект, ядрёна вошь!
print(list_a is list_c)  # False: объекты-то разные, хоть и похожи как близнецы
print(list_a == list_c)  # True: а вот значения у них одинаковые, поэтому True

Так когда же этот is нужен, а?

  • В основном, чтобы проверить, а не None ли это (if value is None). Это святое.
  • Ну или сравнить с какими-нибудь синглтонами вроде True, False (хотя для булевых проверок часто и == сойдёт).

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