Яка різниця між "немає" та "== немає"


324

Нещодавно я натрапив на цей синтаксис, я не знаю різниці.

Я був би вдячний, якби хтось міг сказати мені різницю.



1
Чи відповідає це на ваше запитання? Чи є різниця між "==" і "є"?
червня

Незрозуміло, чи йдеться про це щодо isvs ==, або про природу того, що саме Noneє та як поведінка відрізняється в будь-якому контексті (останнє, чому я тут опинився). Виходячи з розпливчастості та відсутності відповідей ОП ... Я здивований, що в цьому є багато відгуків. Я маю на увазі ... cmon ... запитання навіть не написане в актуальному питанні ...
RTbecard

Відповіді:


291

Відповідь пояснюється тут .

Цитувати:

Клас вільний впроваджувати порівняння будь-яким способом, який він обирає, і він може вибрати порівняння з None, що щось не означає (що насправді має сенс; якщо хтось сказав вам реалізувати об'єкт None з нуля, як би ще ви зробили це для порівняння True проти себе?).

Практично кажучи, немає великої різниці, оскільки користувацькі оператори порівняння рідкісні. Але слід використовувати is Noneяк загальне правило.


57
Крім того, is Noneтрохи (~ 50%) швидше, ніж == None:)
Нас Банов

26
@ myusuf3: >>> timeit.Timer ('None is None'). timeit () | 0,225 | >>> timeit.Timer ('None == None'). 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

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 робить елементне порівняння


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.