Care este diferența dintre „is None” și „== None” (Programare, Python)

myusuf3 a intrebat.

Am întâlnit recent această sintaxă, nu cunosc diferența.

Aș aprecia dacă cineva mi-ar putea spune care este diferența.

Comentarii

  • Vezi Există o diferență între == și is în python? –  > Por Matthew Flaschen.
  • Răspunde la întrebarea dumneavoastră? Există o diferență între „==” și „is”? –  > Por Jun.
  • Nu este clar dacă această întrebare se referă la is vs ==, sau despre natura a ceea ce este exact None este și cum diferă comportamentul în oricare dintre contexte (acesta din urmă este motivul pentru care am ajuns aici). Pe baza neclarității și a lipsei de răspunsuri OP… Sunt surprins că acest lucru are atât de multe upvotes. Adică… cmon… întrebarea nici măcar nu este scrisă în întrebarea propriu-zisă… –  > Por RTbecard.
5 răspunsuri
Ben Hoffstein

Răspunsul este explicat aici.

Pentru a cita:

O clasă este liberă să implementeze comparația în orice mod dorește și poate alege să facă comparația cu None să însemne ceva (ceea ce are sens; dacă cineva v-ar spune să implementați obiectul None de la zero, cum altfel ați putea face ca acesta să compare True cu el însuși?).

Din punct de vedere practic, nu există o mare diferență, deoarece operatorii de comparație personalizați sunt rari. Dar ar trebui să folosiți is None ca regulă generală.

Comentarii

    77

  • De asemenea, puteți să vă adresați și dvs, is None este un pic (~50%) mai rapid decât == None 🙂 –  > Por Nas Banov.
  • 30

  • @myusuf3: >>>> timeit.Timer(‘None is None’).timeit() | 0.225 | >>>> timeit.Timer(‘None == None’).timeit() | 0.328 –  > Por Nas Banov.
  • @myusuf3 Nu prea ai nevoie de o dovadă pentru asta. is este, practic, o comparație între numere întregi în timp ce == nu rezolvă doar referințe, ci și compararea unor valori care pot avea tipuri care nu se potrivesc. –  > Por Pijusn.
  • Una în favoarea lui „is”. Atunci când o variabilă poate fi fie None, fie ceva care nu are nicio comparație semnificativă cu None. De exemplu, o variabilă poate fi un numpy.array sau None (cazul meu particular). –  > Por Jblasco.
  • Aș dori să adaug la ceea ce spune @TimLudwinski: în primul rând, dacă cineva a ales să suprascrie operatorul de egalitate pentru a face din None un caz special, de ce am vrea să le spunem altfel? În al doilea rând, „Ar trebui să existe o – și, de preferință, numai una – modalitate evidentă de a face acest lucru”. Iar modul evident de a verifica dacă ceva este egal cu ceva este, ei bine, operatorul de egalitate. –  > Por Yuval.
unutbu
class Foo:
    def __eq__(self,other):
        return True
foo=Foo()

print(foo==None)
# True

print(foo is None)
# False

Comentarii

  • Vezi stackoverflow.com/a/26611/143931 pentru câteva comentarii interesante despre acest răspuns. –  > Por fuenfundachtzig.
Donald Miner

În acest caz, ele sunt identice. None este un obiect singleton (nu există decât un singur obiect None).

is verifică dacă obiectul este același obiect, în timp ce == verifică doar dacă sunt echivalente.

De exemplu:

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

Dar din moment ce există un singur Nonevor fi întotdeauna identice, iar is va returna True.

p = None
q = None
p is q # True because they are both pointing to the same "None"

Comentarii

    18

  • Acest răspuns nu este corect, așa cum se explică în răspunsul lui Ben Hoffstein de mai jos stackoverflow.com/questions/3257919/is-none-vs-none/…. x == None poate evalua la True chiar dacă x is not None ci o instanță a unei anumite clase cu propriul operator de egalitate personalizat. –  > Por max.
PGlivi

Depinde de ceea ce comparați cu None. Unele clase au metode de comparație personalizate care tratează == None în mod diferit față de is None.

În special ieșirea lui a == None nici măcar nu trebuie să fie boolean !!! – o cauză frecventă de erori.

Pentru un exemplu specific, să luăm o matrice numpy în care == comparație este implementată elementar:

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

Comentarii

  • Cred că acesta este un răspuns mai bun decât răspunsul acceptat în prezent, deoarece are exemple ușor de înțeles. –  > Por Olsgaard.
jf328

Dacă folosiți numpy,

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

vă va da o eroare atunci când numpy face comparația elementwise.

Tags: