6

Сравнение строк в Python: is vs. ==

12

У меня возникла проблема с Python-скриптом, который я разрабатывал. Скрипт вел себя странно, и я обнаружил, что причина в бесконечном цикле. Условия цикла были заданы как while line is not ''. При отладке оказалось, что переменная line на самом деле равна ''. Когда я изменил условие на line != '', цикл заработал без проблем.

Также мне интересно, считается ли более правильным по умолчанию использовать ==, даже при сравнении целых чисел или булевых значений? Я всегда предпочитал использовать is, так как это кажется мне более эстетичным и "питоничным" (поэтому и попал в эту ловушку...), но мне интересно, действительно ли is предназначен исключительно для случаев, когда нужно проверить, ссылаются ли два объекта на один и тот же идентификатор?

2 ответ(ов)

6

Не всегда. NaN — это контрпример. Но обычно идентичность (is) подразумевает равенство (==). Обратное не верно: два разных объекта могут иметь одно и то же значение.

Вы используете ==, когда сравниваете значения, и is, когда сравниваете идентичности.

При сравнении целых чисел (или неизменяемых типов в целом) вы почти всегда хотите использовать первое. Существует оптимизация, которая позволяет сравнивать маленькие целые числа с помощью is, но не стоит на это полагаться.

Для булевых значений не следует вообще использовать сравнения. Вместо:

if x == True:
    # выполняем что-то

пишите:

if x:
    # выполняем что-то

При сравнении с None предпочтительнее использовать is None вместо == None.

Что касается вашего предпочтения использования is, потому что вам это кажется более эстетически приятным и питоническим, имейте в виду, что это именно то, для чего он предназначен: для проверки того, что два объекта имеют одинаковый идентификатор.

2

Давайте рассмотрим небольшой пример, как 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".)

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь