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

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

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

Я провел тест в оболочке Python и определил, что оба my_var is None являются действительными, но мой редактор, похоже, говорит, что my_var is None - предпочтительнее.

Так ли это, и если да, то почему?

Ответ 1

Резюме:

Используйте is, если вы хотите проверить идентичность объекта (например, проверить, есть ли var None). Используйте ==, если вы хотите проверить равенство (например, Is 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

Ответ 2

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

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

Ответ 3

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