Комментарии (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.