Python Identity Operators: Understanding 'is' and 'is not' (Перевод на русский)
Приветствуем, будущие программисты на Python! Сегодня мы погружаемся в захватывающую сторону Python: операторы идентичности. Не волнуйтесь, если вы новичок в программировании; я проведу вас через эту концепцию шаг за шагом, как я делал это для многих студентов на протяжении многих лет своей преподавательской деятельности. Так что возьмите стакан вашего любимого напитка, и давайте отправимся в этот увлекательное путешествие вместе!
Что такое операторы идентичности в 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
Разберем эти примеры:
-
В первом примере 'a' и 'b' присваиваются значение 5. Python оптимизирует память, делая малые целые числа (обычно от -5 до 256) общими для одного места в памяти. Таким образом, 'a' и 'b' на самом деле ссылаются на один и тот же объект в памяти, делая 'a is b' равным True.
-
Во втором примере, хотя list1 и list2 содержат одни и те же значения, они являются двумя разными объектами в памяти. Поэтому 'list1 is list2' возвращает False.
-
В третьем примере '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
Разберем эти примеры:
-
В первом примере Python оптимизирует память для малых строк, делая str1 и str2 ссылаются на один и тот же объект. Таким образом, 'str1 is not str2' возвращает False.
-
Во втором примере, как мы уже видели ранее, list1 и list2 являются отдельными объектами в памяти, поэтому 'list1 is not list2' возвращает True.
-
В третьем примере 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
Разберем эти примеры:
-
В первом примере мы используем 'is not None', чтобы проверить, было ли предоставлено имя для нашей функции приветствие. Это распространенный шаблон в Python для обработки опциональных параметров.
-
Во втором примере мы используем 'is not None' в сочетании с другими проверками. Здесь мы убеждаемся, что наш список существует (не None) и пуст.
-
В третьем примере мы демонстрируем, как 'is' ведет себя с пользовательскими объектами. Хотя человек1 и человек2 имеют одно и то же имя, они являются разными объектами в памяти. Однако человек3 присвоен тот же объект, что и человек1, поэтому 'человек1 is человек3' возвращает True.
Заключение
Итак, это было! Мы путешествовали по земле операторов идентичности Python. Помните, 'is' и 'is not' касаются идентичности, а не равенства. Они проверяют, являются ли объекты точно тем же объектом в памяти, а не то, что у них одинаковые значения.
В мои годы преподавания я заметил, что студенты часто путают 'is' с '=='. Вот небольшая рифма, которую я использую, чтобы запомнить: "Is is для идентичности, equals equals для равенства!"
Практикуйтесь с этими операторами, играйтесь с различными примерами, и скоро вы будете использовать их как профессионал. Счастливого кодирования, и помните: в Python, как и в жизни, важно не только то, что что-то есть, но и где оно находится!
Credits: Image by storyset