Дополнительно
Сравнение строк в Python: is против ==
Я заметил, что сценарий Python, который я писал, ведет себя странно, и отследил это до бесконечного цикла, где условием цикла было while line is not ''
. Проверив его в отладчике, оказалось, что строка на самом деле была '''
. Когда я изменил ее на !='''
, а не на is not '''
, все заработало нормально.
Кроме того, считается ли вообще, что лучше просто использовать '==' по умолчанию, даже при сравнении значений int или Boolean? Мне всегда нравилось использовать 'is', потому что я нахожу его более эстетичным и питоничным (вот как я попал в эту ловушку...), но мне интересно, предназначен ли он только для тех случаев, когда вам важно найти два объекта с одинаковым id.
519
4
Не всегда. NaN является контрпримером. Но обычно тождество (
is
) подразумевает равенство (==
). Обратное не верно: два разных объекта могут иметь одинаковое значение.Вы используете
==
при сравнении значений иis
при сравнении тождеств.При сравнении ints (или неизменяемых типов в целом) вы практически всегда хотите использовать первое. Существует оптимизация, которая позволяет сравнивать небольшие целые числа с помощью
is
, но не стоит на нее полагаться.Для булевых значений вы вообще не должны выполнять сравнение. Вместо:
пишите:
Для сравнения с
None
,is None
предпочтительнее, чем== None
.Да, именно для этого она и предназначена.
Я хотел бы показать небольшой пример того, как
is
и==
задействованы в неизменяемых типах. Попробуйте это сделать:is
сравнивает два объекта в памяти,==
сравнивает их значения. Например, вы можете видеть, что маленькие целые числа кэшируются Python:Вы должны использовать
==
при сравнении значений иis
при сравнении тождеств. (Также, с точки зрения английского языка, "равно" отличается от "есть").Логика не ущербна. Заявление
должны не будет читать
Это логическая ошибка со стороны читателя предположить, что обращение с заявлением логика верна. См. http://en.wikipedia.org/wiki/Converse_(логика)
См. Этот вопрос
Ваша логика в чтении
является несколько ошибочным.
Если
is
применимо, то==
будет True, но оно НЕ применимо в обратную сторону.==
может дать True, в то время какis
даст False.