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