Вопрос-Ответ

String comparison in Python: is vs. == [duplicate]

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

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

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

Переведено автоматически
Ответ 1

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


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


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


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

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

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

if x == True:
# do something

написать:

if x:
# do something

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


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


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

Ответ 2

Я хотел бы показать небольшой пример того, как 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".)

Ответ 3

Логика не является ошибочной. Утверждение


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


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


если x==y, то x равно y


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

Ответ 4

Смотрите Этот вопрос

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


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


имеет небольшие недостатки.

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

python string