В чем разница между «нет» и «== нет»

325

Я недавно сталкивался с этим синтаксисом, я не знаю о разнице.

Буду признателен, если кто-нибудь скажет мне разницу.

myusuf3
источник
1
Отвечает ли это на ваш вопрос? Есть ли разница между "==" и "есть"?
июнь
Неясно, касается ли этот вопрос « isпротив» ==или о природе того, что именно Noneесть, и как поведение отличается в любом контексте (последнее, почему я оказался здесь). Основываясь на неопределенности и отсутствии откликов OP ... Я удивлен, что это так много голосов. Я имею в виду ... cmon ... вопрос даже не написан в реальном вопросе ...
RTbecard

Ответы:

292

Ответ объясняется здесь .

Цитировать:

Класс может осуществлять сравнение любым способом, который он выберет, и он может выбрать, чтобы сравнение с None означало что-то (что на самом деле имеет смысл; если бы кто-то сказал вам реализовать объект None с нуля, как еще вы могли бы заставить его сравнивать True? против себя?).

Практически нет большой разницы, так как пользовательские операторы сравнения встречаются редко. Но вы должны использовать is Noneкак общее правило.

Бен Хоффштейн
источник
57
Кроме того, is Noneэто немного (~ 50%) быстрее, чем == None:)
Нас Банов
26
@ myusuf3: >>> timeit.Timer ('None is None'). timeit () | 0,225 | >>> timeit.Timer ('Нет == Нет'). timeit () | 0,328
Нас Банов
9
@ myusuf3 Тебе не нужны доказательства для этого. isэто, в основном, целочисленное сравнение, в то время как ==это не только разрешение ссылок, но и сравнение значений, которые могут иметь несовпадающие типы.
Pijusn
4
Один на пользу "есть". Когда переменная может иметь значение None или что-либо, что не имеет смысла сравнивать с None. Например, переменная может быть numpy.array или None (мой частный случай).
Jblasco
3
Я хотел бы добавить к тому, что говорит @TimLudwinski: во-первых, если кто-то решил переопределить оператор равенства, чтобы None стал особым случаем, почему мы хотим сказать им иначе? Второе: «Должен быть один - и желательно только один - очевидный способ сделать это». И очевидный способ проверить, является ли что-то равным чему-либо, это, в общем, оператор равенства.
Юваль
162
class Foo:
    def __eq__(self,other):
        return True
foo=Foo()

print(foo==None)
# True

print(foo is None)
# False
unutbu
источник
56

В этом случае они одинаковы. Noneявляется одноэлементным объектом (существует только один None).

is проверяет, является ли объект тем же объектом, а == просто проверяет, эквивалентны ли они.

Например:

p = [1]
q = [1]
p is q # False because they are not the same actual object
p == q # True because they are equivalent

Но поскольку существует только один None, они всегда будут одинаковыми и isвернут True.

p = None
q = None
p is q # True because they are both pointing to the same "None"
Дональд Майнер
источник
17
Этот ответ не является правильным, как объяснено в ответе Бена Хоффштейна ниже stackoverflow.com/questions/3257919/is-none-vs-none/… . x == Noneможет вычислять Trueдаже если xне Noneявляется экземпляром некоторого класса со своим собственным оператором равенства.
максимум
5

Если вы используете NumPy,

if np.zeros(3)==None: pass

даст вам ошибку, когда NumPy делает поэлементное сравнение

jf328
источник
3

Это зависит от того, что вы сравниваете с 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 is None #compares object to object, outputs False
PGlivi
источник