← Назад к вопросам

В чем разница между == и is?

1.0 Junior🔥 121 комментариев
#Python

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между == и is в Python

Определение

== — проверяет равенство значений (value comparison)

is — проверяет идентичность объектов (identity comparison)

Принцип работы

== (equals)

Сравнивает содержимое двух объектов:

a = [1, 2, 3]
b = [1, 2, 3]

print(a == b)  # True (значения одинаковые)
print(a is b)  # False (разные объекты в памяти)

Проверяет, вызывая метод eq():

class Person:
    def __init__(self, name):
        self.name = name
    
    def __eq__(self, other):
        return self.name == other.name

p1 = Person("John")
p2 = Person("John")
print(p1 == p2)  # True (имена одинаковые)
print(p1 is p2)  # False (разные объекты)

is (identity)

Проверяет, указывают ли обе переменные на один объект в памяти:

a = [1, 2, 3]
b = a

print(a == b)  # True (одинаковые значения)
print(a is b)  # True (один и тот же объект)
print(id(a) == id(b))  # True (одинаковые адреса памяти)

Наглядная демонстрация

# Списки
list1 = [1, 2, 3]
list2 = [1, 2, 3]
list3 = list1

print(list1 == list2)   # True (значения совпадают)
print(list1 is list2)   # False (разные объекты)
print(list1 is list3)   # True (один объект)

# Строки (кэширование)
s1 = "hello"
s2 = "hello"
s3 = "h" + "ello"

print(s1 == s2)  # True
print(s1 is s2)  # True (строки интернированы)
print(s1 == s3)  # True
print(s1 is s3)  # False (разные объекты, обычно)

# None
a = None
b = None
print(a is b)  # True (всегда один объект None)
print(a == b)  # True

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

Проверка None:

# Правильно - используем is
if value is None:
    print("Value is None")

# Неправильно - используем ==
if value == None:  # Работает, но не рекомендуется
    print("Value is None")

Проверка Boolean:

# Правильно
if is_active is True:
    print("Active")

# Неправильно (хотя и работает)
if is_active == True:
    print("Active")

# Лучше всего
if is_active:
    print("Active")

Примеры в тестировании

import pytest

def test_list_comparison():
    list1 = [1, 2, 3]
    list2 = [1, 2, 3]
    
    # Правильно - проверяем значения
    assert list1 == list2
    
    # Неправильно - проверяем объект
    # assert list1 is list2  # Упадет!

def test_none_check():
    result = None
    
    # Правильно
    assert result is None
    assert result == None  # Работает, но не рекомендуется

def test_object_identity():
    user1 = {"name": "John", "age": 30}
    user2 = {"name": "John", "age": 30}
    user3 = user1
    
    assert user1 == user2  # True - значения одинаковые
    assert user1 is not user2  # True - разные объекты
    assert user1 is user3  # True - один объект

def test_custom_objects():
    class User:
        def __init__(self, name):
            self.name = name
        
        def __eq__(self, other):
            return self.name == other.name
    
    u1 = User("John")
    u2 = User("John")
    u3 = u1
    
    assert u1 == u2  # True (переопределен __eq__)
    assert u1 is not u2  # True (разные объекты)
    assert u1 is u3  # True (один объект)

Правила использования

Используйте ==:

  • Для сравнения значений
  • Для списков, словарей, строк
  • Для чисел и пользовательских объектов

Используйте is:

  • Для проверки None: if x is None
  • Для проверки того же объекта
  • Редко, в специальных случаях

Производительность

is быстрее, чем ==, так как просто сравнивает адреса памяти:

import timeit

# is быстрее
print(timeit.timeit("None is None"))  # Быстро
print(timeit.timeit("None == None"))  # Медленнее

# Для больших объектов разница видна
a = list(range(1000))
b = list(range(1000))
print(timeit.timeit("a is b"))  # Быстро
print(timeit.timeit("a == b"))  # Медленнее

Для QA-тестирования: используйте == для проверки значений, is для проверки None.

В чем разница между == и is? | PrepBro