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

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

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

+460
источник поделиться
4 ответа

Для всех встроенных объектов 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', потому что Я нахожу его более эстетичным и pythonic (вот как я упал эта ловушка...), но мне интересно, предназначенные для резервирования только тогда, когда вы заботитесь о поиске двух объектов с тем же идентификатором.

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

+545
источник

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

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".)

+233
источник

Логика не является недостатком. Утверждение

если x равно y, тогда x == y также True

следует никогда читать

если x == y, тогда x есть y

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

+62
источник

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

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

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

немного испорчен.

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

+25
источник

Посмотрите другие вопросы по меткам или Задайте вопрос