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

Ответ

Оператор = и оператор is выполняют принципиально разные функции в Python:

Оператор Назначение Проверяет
= Присваивание Сохраняет ссылку на объект в переменную.
is Проверка идентичности Указывают ли две переменные на один и тот же объект в памяти.

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

Практические примеры:

# Пример 1: Присваивание и идентичность
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: значения объектов равны

# Пример 2: Особый случай с None, True, False
x = None
print(x is None)   # Идиоматически правильная проверка на None (True)
# print(x == None) # Работает, но менее эффективно и не рекомендуется PEP 8

# Пример 3: Кэширование малых целых чисел (деталь реализации CPython)
a = 100
b = 100
print(a is b)      # Может быть True для чисел от -5 до 256

c = 1000
d = 1000
print(c is d)      # Чаще False (разные объекты)

Рекомендации по использованию:

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

Ответ 18+ 🔞

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

= — это просто присваивание. Взял объект и сунул на него ссылку в переменную. Всё. Никакой магии, чистая бюрократия.
is — это проверка идентичности. Он смотрит, не тыкают ли две переменные пальцем в один и тот же кусок памяти. Это как спросить: «Вы близнецы или просто похожи?»

Главная разница в том, что == спрашивает: «Значения одинаковые?» (через внутренний метод __eq__), а is орёт: «Да вы один и тот же объект, блядь?» (сравнивает id()).

Ну, примеры, чтобы совсем мозг не взорвался:

# Пример 1: Присваивание vs копирование
list_a = [1, 2, 3]
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 — но значения-то одинаковые! Вот что проверяет ==.

# Пример 2: Священные константы — None, True, False
x = None
print(x is None)   # Вот это идиоматически верно! Так и делай, без вариантов.
# print(x == None) # Сработает, но это как отвёрткой гвозди забивать. Не надо так.

# Пример 3: Магия мелких чисел (деталь реализации CPython, на неё не надейся!)
a = 100
b = 100
print(a is b)      # Может быть True, потому что Python кэширует мелкие целые (-5 до 256).

c = 1000
d = 1000
print(c is d)      # А тут уже False — два разных объекта в памяти. Вот тебе и хитрая жопа.

Итог, чтобы не быть распиздяем:

  • is юзай только для None, True, False. Для всего остального — доверия ебать ноль.
  • == — твой рабочий инструмент для сравнения значений: списков, строк, чисел.
  • Никогда не используй is для сравнения чисел или строк в логике программы. Это как ходить по охуенно тонкому льду — один раз пронесёт, а потом накроешься медным тазом.