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




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






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



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



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



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

614   3  

3 ответов:

резюме:

использовать 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

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

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

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

Comments

    Ничего не найдено.