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