Python нет сравнения: должен ли я использовать "is" или ==?


Возможный дубликат:
когда оператор '= = 'не эквивалентен оператору 'is'? (Python)

Я использую Python 2.x.

Мой редактор дает мне "предупреждение" подчеркивание, когда я сравниваю my_var == None, но никакого предупреждения, когда я использую my_var is None.

Я провел тест в оболочке Python и определил, что оба синтаксиса допустимы, но мой редактор, похоже, говорит, что my_var is None предпочтительнее. Так ли это, и если да, то почему?
3 138

3 ответа:

Резюме:

Используйте is, Когда вы хотите проверить идентичность объекта (например, проверить, является ли var None). Используйте ==, Когда вы хотите проверитьравенство (например, равен ли var 3?).

Пояснение:

У вас могут быть пользовательские классы, где my_var == None вернет True

Например:

class Negator(object):
    def __eq__(self,other):
        return not other

thing = Negator()
print thing == None    #True
print thing is None    #False

is проверяет идентичность объекта . Существует только 1 Объект None, поэтому, когда вы делаете my_var is None, вы проверяете, являются ли они фактически являются одним и тем же объектом (а не просто эквивалентными объектами)

Другими словами, == является проверкой эквивалентности (которая определяется от объекта к объекту), тогда как is проверяет идентичность объекта:
lst = [1,2,3]
lst == lst[:]  # This is True since the lists are "equivalent"
lst is lst[:]  # This is False since they're actually different objects

is обычно предпочтительнее при сравнении произвольных объектов с синглетами, такими как None, потому что это быстрее и более предсказуемо. is всегда сравнивает по тождеству объектов, тогда как то, что будет делать ==, зависит от точного типа операндов и даже от их порядка.

Эта рекомендация поддерживаетсяPEP 8 , которыйявно заявляет , что "сравнения с синглетонами, такими как None, всегда должны выполняться с is или is not, никогда не операторы равенства."

PEP 8 определяет, что при сравнении синглетов лучше использовать оператор is.