Сравнение строк в 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?
Как заполнить строку в Python пробелами?
Диапазон букв в Python
Элегантные способы поддержки эквивалентности ("равенства") в классах Python