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

«В чем разница между оператором присваивания (=) и оператором ‘is’ в Python?» — вопрос из категории Python, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оператор = и оператор 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 для сравнения числовых или строковых значений, если не уверены в механизме интернирования.