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

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

Кроме того, считается ли вообще, что лучше просто использовать '==' по умолчанию, даже при сравнении значений int или Boolean? Мне всегда нравилось использовать 'is', потому что я нахожу его более эстетичным и питоничным (вот как я попал в эту ловушку...), но мне интересно, предназначен ли он только для тех случаев, когда вам важно найти два объекта с одинаковым id.

Комментарии к вопросу (3)
Решение

Для всех встроенных объектов Python (таких как строки, списки, dicts, функции, и т.д.), если x равно y, то x==y также будет истинным.

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

Кроме того, считается ли вообще, что лучше просто использовать '==' по умолчанию, даже при сравнении значений int или Boolean?

Вы используете == при сравнении значений и is при сравнении тождеств.

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

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

if x == True:
    # do something

пишите:

if x:
    # do something

Для сравнения с None, is None предпочтительнее, чем == None.

Мне 'всегда нравилось использовать 'is', потому что я нахожу его более эстетичным. и питоническим (вот как я попал в эту ловушку...), но я задаюсь вопросом, не предназначено ли оно предназначено только для тех случаев. вы заботитесь о поиске двух объектов с одинаковым идентификатором.

Да, именно для этого она и предназначена.

Комментарии (18)

Я хотел бы показать небольшой пример того, как is и == задействованы в неизменяемых типах. Попробуйте это сделать:

a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True

is сравнивает два объекта в памяти, == сравнивает их значения. Например, вы можете видеть, что маленькие целые числа кэшируются Python:

c = 1
b = 1
>>> b is c
True

Вы должны использовать == при сравнении значений и is при сравнении тождеств. (Также, с точки зрения английского языка, "равно" отличается от "есть").

Комментарии (4)

Логика не ущербна. Заявление

если X Y, то Х==Y-это тоже правда

должны не будет читать

если X==Y, то X является г

Это логическая ошибка со стороны читателя предположить, что обращение с заявлением логика верна. См. http://en.wikipedia.org/wiki/Converse_(логика)

Комментарии (2)

См. Этот вопрос

Ваша логика в чтении

Для всех встроенных объектов Python (таких как строки, списки, dicts, функции, и т.д.), если x равно y, то x==y также является истинным.

является несколько ошибочным.

Если is применимо, то == будет True, но оно НЕ применимо в обратную сторону. == может дать True, в то время как is даст False.

Комментарии (2)