Сравнение строк в Python: is vs. ==
У меня возникла проблема с Python-скриптом, который я разрабатывал. Скрипт вел себя странно, и я обнаружил, что причина в бесконечном цикле. Условия цикла были заданы как while line is not ''
. При отладке оказалось, что переменная line
на самом деле равна ''
. Когда я изменил условие на line != ''
, цикл заработал без проблем.
Также мне интересно, считается ли более правильным по умолчанию использовать ==
, даже при сравнении целых чисел или булевых значений? Я всегда предпочитал использовать is
, так как это кажется мне более эстетичным и "питоничным" (поэтому и попал в эту ловушку...), но мне интересно, действительно ли is
предназначен исключительно для случаев, когда нужно проверить, ссылаются ли два объекта на один и тот же идентификатор?
2 ответ(ов)
Не всегда. NaN — это контрпример. Но обычно идентичность (is
) подразумевает равенство (==
). Обратное не верно: два разных объекта могут иметь одно и то же значение.
Вы используете ==
, когда сравниваете значения, и is
, когда сравниваете идентичности.
При сравнении целых чисел (или неизменяемых типов в целом) вы почти всегда хотите использовать первое. Существует оптимизация, которая позволяет сравнивать маленькие целые числа с помощью is
, но не стоит на это полагаться.
Для булевых значений не следует вообще использовать сравнения. Вместо:
if x == True:
# выполняем что-то
пишите:
if x:
# выполняем что-то
При сравнении с None
предпочтительнее использовать is None
вместо == None
.
Что касается вашего предпочтения использования is
, потому что вам это кажется более эстетически приятным и питоническим, имейте в виду, что это именно то, для чего он предназначен: для проверки того, что два объекта имеют одинаковый идентификатор.
Давайте рассмотрим небольшой пример, как is
и ==
работают с неизменяемыми типами в Python. Попробуйте следующий код:
a = 19998989890
b = 19998989889 + 1
>>> a is b
False
>>> a == b
True
Здесь is
сравнивает два объекта в памяти, а ==
сравнивает их значения. Как вы можете заметить, небольшие целые числа кэшируются в Python:
c = 1
b = 1
>>> b is c
True
Таким образом, вы должны использовать ==
, когда сравниваете значения, и is
, когда сравниваете идентичности. (Также стоит отметить, что с точки зрения языка "equals" отличается от "is".)
Почему сравнение строк с помощью '==' и 'is' иногда дает разные результаты?
Есть ли в Python метод подстроки 'contains' для строк?
Объединение двух столбцов текста в DataFrame pandas
Вывод строки в текстовый файл
Как извлечь числа из строки в Python?