Python Identity Operators: Understanding 'is' and 'is not' (Перевод на русский)

Приветствуем, будущие программисты на Python! Сегодня мы погружаемся в захватывающую сторону Python: операторы идентичности. Не волнуйтесь, если вы новичок в программировании; я проведу вас через эту концепцию шаг за шагом, как я делал это для многих студентов на протяжении многих лет своей преподавательской деятельности. Так что возьмите стакан вашего любимого напитка, и давайте отправимся в этот увлекательное путешествие вместе!

Python - Identity Operators

Что такое операторы идентичности в Python?

Перед тем как перейти к деталям, давайте поймем, что такое операторы идентичности. В Python операторы идентичности используются для сравнения мест в памяти двух объектов. Они не сравнивают значения объектов, а проверяют, являются ли объекты фактически тем же объектом в памяти.

Представьте себе следующую ситуацию: вы и ваш друг оба имеете красные велосипеды. Они могут выглядеть идентично, но это не один и тот же велосипед. Такой тип различия помогает нам операторы идентичности в Python.

В Python есть два оператора идентичности:

Оператор Описание
is Возвращает True, если оба операнда ссылаются на один и тот же объект
is not Возвращает True, если оба операнда не ссылаются на один и тот же объект

Теперь рассмотрим каждый из этих операторов подробнее.

Оператор Python 'is'

Оператор 'is' проверяет, имеют ли два объекта одну идентичность, что означает, что они занимают одно и то же место в памяти. Он возвращает True, если объекты идентичны, и False в противном случае.

Посмотрим на несколько примеров:

# Пример 1: Сравнение целых чисел
a = 5
b = 5
print(a is b)  # Вывод: True

# Пример 2: Сравнение списков
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 is list2)  # Вывод: False

# Пример 3: Сравнение с None
x = None
print(x is None)  # Вывод: True

Разберем эти примеры:

  1. В первом примере 'a' и 'b' присваиваются значение 5. Python оптимизирует память, делая малые целые числа (обычно от -5 до 256) общими для одного места в памяти. Таким образом, 'a' и 'b' на самом деле ссылаются на один и тот же объект в памяти, делая 'a is b' равным True.

  2. Во втором примере, хотя list1 и list2 содержат одни и те же значения, они являются двумя разными объектами в памяти. Поэтому 'list1 is list2' возвращает False.

  3. В третьем примере 'None' является специальным одиночным объектом в Python. Любая переменная, присвоенная None, всегда будет ссылаться на этот один и тот же объект, поэтому 'x is None' возвращает True.

Оператор Python 'is not'

Оператор 'is not' является просто отрицанием оператора 'is'. Он возвращает True, если объекты не являются одним и тем же объектом в памяти, и False, если они являются.

Посмотрим на несколько примеров:

# Пример 1: Сравнение строк
str1 = "Hello"
str2 = "Hello"
print(str1 is not str2)  # Вывод: False

# Пример 2: Сравнение списков снова
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 is not list2)  # Вывод: True

# Пример 3: Сравнение с None
y = 10
print(y is not None)  # Вывод: True

Разберем эти примеры:

  1. В первом примере Python оптимизирует память для малых строк, делая str1 и str2 ссылаются на один и тот же объект. Таким образом, 'str1 is not str2' возвращает False.

  2. Во втором примере, как мы уже видели ранее, list1 и list2 являются отдельными объектами в памяти, поэтому 'list1 is not list2' возвращает True.

  3. В третьем примере y присваивается значение 10, которое не равно None. Таким образом, 'y is not None' возвращает True.

Практические примеры с объяснениями операторов идентичности Python

Теперь, когда мы покрыли основы, давайте рассмотрим несколько более практических примеров, чтобы укрепить наше понимание.

# Пример 1: Функция возвращающая None
def приветствие(имя=None):
if имя is not None:
return f"Привет, {имя}!"
else:
return "Привет, незнакомец!"

print(приветствие())  # Вывод: Привет, незнакомец!
print(приветствие("Алиса"))  # Вывод: Привет, Алиса!

# Пример 2: Проверка пустых коллекций
пустой_список = []
if пустой_список is not None and len(пустой_список) == 0:
print("Список пуст, но не None")

# Пример 3: Сравнение объектов
class Человек:
def __init__(self, имя):
self.имя = имя

человек1 = Человек("Боб")
человек2 = Человек("Боб")
человек3 = человек1

print(человек1 is человек2)  # Вывод: False
print(человек1 is человек3)  # Вывод: True

Разберем эти примеры:

  1. В первом примере мы используем 'is not None', чтобы проверить, было ли предоставлено имя для нашей функции приветствие. Это распространенный шаблон в Python для обработки опциональных параметров.

  2. Во втором примере мы используем 'is not None' в сочетании с другими проверками. Здесь мы убеждаемся, что наш список существует (не None) и пуст.

  3. В третьем примере мы демонстрируем, как 'is' ведет себя с пользовательскими объектами. Хотя человек1 и человек2 имеют одно и то же имя, они являются разными объектами в памяти. Однако человек3 присвоен тот же объект, что и человек1, поэтому 'человек1 is человек3' возвращает True.

Заключение

Итак, это было! Мы путешествовали по земле операторов идентичности Python. Помните, 'is' и 'is not' касаются идентичности, а не равенства. Они проверяют, являются ли объекты точно тем же объектом в памяти, а не то, что у них одинаковые значения.

В мои годы преподавания я заметил, что студенты часто путают 'is' с '=='. Вот небольшая рифма, которую я использую, чтобы запомнить: "Is is для идентичности, equals equals для равенства!"

Практикуйтесь с этими операторами, играйтесь с различными примерами, и скоро вы будете использовать их как профессионал. Счастливого кодирования, и помните: в Python, как и в жизни, важно не только то, что что-то есть, но и где оно находится!

Credits: Image by storyset