Неясно, касается ли этот вопрос « isпротив» ==или о природе того, что именно Noneесть, и как поведение отличается в любом контексте (последнее, почему я оказался здесь). Основываясь на неопределенности и отсутствии откликов OP ... Я удивлен, что это так много голосов. Я имею в виду ... cmon ... вопрос даже не написан в реальном вопросе ...
Класс может осуществлять сравнение любым способом, который он выберет, и он может выбрать, чтобы сравнение с None означало что-то (что на самом деле имеет смысл; если бы кто-то сказал вам реализовать объект None с нуля, как еще вы могли бы заставить его сравнивать True? против себя?).
Практически нет большой разницы, так как пользовательские операторы сравнения встречаются редко. Но вы должны использовать is Noneкак общее правило.
@ myusuf3 Тебе не нужны доказательства для этого. isэто, в основном, целочисленное сравнение, в то время как ==это не только разрешение ссылок, но и сравнение значений, которые могут иметь несовпадающие типы.
Pijusn
4
Один на пользу "есть". Когда переменная может иметь значение None или что-либо, что не имеет смысла сравнивать с None. Например, переменная может быть numpy.array или None (мой частный случай).
Jblasco
3
Я хотел бы добавить к тому, что говорит @TimLudwinski: во-первых, если кто-то решил переопределить оператор равенства, чтобы None стал особым случаем, почему мы хотим сказать им иначе? Второе: «Должен быть один - и желательно только один - очевидный способ сделать это». И очевидный способ проверить, является ли что-то равным чему-либо, это, в общем, оператор равенства.
Этот ответ не является правильным, как объяснено в ответе Бена Хоффштейна ниже stackoverflow.com/questions/3257919/is-none-vs-none/… . x == Noneможет вычислять Trueдаже если xне Noneявляется экземпляром некоторого класса со своим собственным оператором равенства.
максимум
5
Если вы используете NumPy,
if np.zeros(3)==None:pass
даст вам ошибку, когда NumPy делает поэлементное сравнение
Это зависит от того, что вы сравниваете с None. Некоторые классы имеют пользовательские методы сравнения, которые == Noneотличаются от is None.
В частности, вывод a == Noneдаже не должен быть логическим !! - частая причина ошибок.
Для конкретного примера возьмем пустой массив, в котором ==сравнение реализовано поэлементно:
import numpy as np
a = np.zeros(3)# now a is array([0., 0., 0.])
a ==None#compares elementwise, outputs array([False, False, False]), i.e. not boolean!!!
a isNone#compares object to object, outputs False
==
иis
в Python?is
против»==
или о природе того, что именноNone
есть, и как поведение отличается в любом контексте (последнее, почему я оказался здесь). Основываясь на неопределенности и отсутствии откликов OP ... Я удивлен, что это так много голосов. Я имею в виду ... cmon ... вопрос даже не написан в реальном вопросе ...Ответы:
Ответ объясняется здесь .
Цитировать:
Практически нет большой разницы, так как пользовательские операторы сравнения встречаются редко. Но вы должны использовать
is None
как общее правило.источник
is None
это немного (~ 50%) быстрее, чем== None
:)is
это, в основном, целочисленное сравнение, в то время как==
это не только разрешение ссылок, но и сравнение значений, которые могут иметь несовпадающие типы.источник
В этом случае они одинаковы.
None
является одноэлементным объектом (существует только одинNone
).is
проверяет, является ли объект тем же объектом, а == просто проверяет, эквивалентны ли они.Например:
Но поскольку существует только один
None
, они всегда будут одинаковыми иis
вернут True.источник
x == None
может вычислятьTrue
даже еслиx
неNone
является экземпляром некоторого класса со своим собственным оператором равенства.Если вы используете NumPy,
даст вам ошибку, когда NumPy делает поэлементное сравнение
источник
Это зависит от того, что вы сравниваете с None. Некоторые классы имеют пользовательские методы сравнения, которые
== None
отличаются отis None
.В частности, вывод
a == None
даже не должен быть логическим !! - частая причина ошибок.Для конкретного примера возьмем пустой массив, в котором
==
сравнение реализовано поэлементно:источник