Я заметил, что сценарий Python, который я писал, ведет себя странно, и отследил это до бесконечного цикла, где условием цикла было while line is not ''
. Проверив его в отладчике, оказалось, что строка на самом деле была '''
. Когда я изменил ее на !='''
, а не на is not '''
, все заработало нормально.
Кроме того, считается ли вообще, что лучше просто использовать '==' по умолчанию, даже при сравнении значений int или Boolean? Мне всегда нравилось использовать 'is', потому что я нахожу его более эстетичным и питоничным (вот как я попал в эту ловушку...), но мне интересно, предназначен ли он только для тех случаев, когда вам важно найти два объекта с одинаковым id.
Для всех встроенных объектов 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', потому что я нахожу его более эстетичным. и питоническим (вот как я попал в эту ловушку...), но я задаюсь вопросом, не предназначено ли оно предназначено только для тех случаев. вы заботитесь о поиске двух объектов с одинаковым идентификатором.
Да, именно для этого она и предназначена.
Я хотел бы показать небольшой пример того, как is
и ==
задействованы в неизменяемых типах. Попробуйте это сделать:
a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True
is
сравнивает два объекта в памяти, ==
сравнивает их значения. Например, вы можете видеть, что маленькие целые числа кэшируются Python:
c = 1
b = 1
>>> b is c
True
Вы должны использовать ==
при сравнении значений и is
при сравнении тождеств. (Также, с точки зрения английского языка, "равно" отличается от "есть").
Логика не ущербна. Заявление
если X Y, то Х==Y-это тоже правда
должны не будет читать
если X==Y, то X является г
Это логическая ошибка со стороны читателя предположить, что обращение с заявлением логика верна. См. http://en.wikipedia.org/wiki/Converse_(логика)
См. Этот вопрос
Ваша логика в чтении
Для всех встроенных объектов Python (таких как строки, списки, dicts, функции, и т.д.), если x равно y, то x==y также является истинным.
является несколько ошибочным.
Если is
применимо, то ==
будет True, но оно НЕ применимо в обратную сторону. ==
может дать True, в то время как is
даст False.