Сравнение Python None: должен ли я использовать "is" или ==?
Возможные Дубликаты:
когда оператор '= = 'не эквивалентен оператору` is'? (Python)
Я использую Python 2.x.
мой редактор дает мне "предупреждение" подчеркивание, когда я сравниваю my_var == None, но без предупреждения, когда я использую my_var is None.
Я сделал тест в оболочке Python и определил, что оба являются допустимым синтаксисом, но мой редактор, похоже, говорит, что my_var is None предпочтительнее.
так ли это, и если да, то почему?
3 ответов:
резюме:
использовать
isкогда вы хотите проверить против объекта личность (например, проверка, чтобы увидеть, еслиvar- этоNone). Используйте==когда вы хотите проверить равенство (например, Isvarравна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, не операторы равенства."
Comments