Er det noen forskjell mellom "foo er None" og "foo == None"?

stemmer
207

Er det noen forskjell mellom:

if foo is None: pass

og

if foo == None: pass

Konvensjonen som jeg har sett i de fleste Python-kode (og koden jeg selv skriver) er den tidligere, men jeg nylig kom over kode som bruker sistnevnte. Ingen er en forekomst (og det eneste tilfellet, IIRC) av NoneType, så det bør ikke saken, ikke sant? Er det noen situasjoner der det kan?

Publisert på 25/08/2008 klokken 18:27
kilden bruker
På andre språk...                            


12 svar

stemmer
242

isalltid returnerer Truehvis den sammenligner det samme objekt forekomsten

Mens ==er i siste instans bestemmes av den __eq__()metode

dvs


>>> class Foo(object):
       def __eq__(self, other):
           return True

>>> f = Foo()
>>> f == None
True
>>> f is None
False
Svarte 25/08/2008 kl. 18:38
kilden bruker

stemmer
47

Det kan være lurt å lese dette objektet identitet og likeverdighet .

Uttalelsen 'er' brukes for objekt identitet, sjekker den om gjenstander refererer til samme instans (samme adresse i minnet).

Og '==' utsagn refererer til likestilling (samme verdi).

Svarte 25/08/2008 kl. 18:48
kilden bruker

stemmer
24

Et ord av forsiktighet:

if foo:
  # do something

Er ikke akkurat det samme som:

if x is not None:
  # do something

Førstnevnte er en boolsk verdi test, og kan vurdere å falske i ulike sammenhenger. Det finnes en rekke ting som representerer falsk i en boolsk verdi tester for eksempel tomme beholdere, boolske verdier. Ingen vurderer også å usant i denne situasjonen, men andre ting gjør også.

Svarte 26/08/2008 kl. 13:44
kilden bruker

stemmer
12

(ob1 is ob2) lik (id(ob1) == id(ob2))

Svarte 25/02/2009 kl. 10:34
kilden bruker

stemmer
11

Årsaken foo is Noneer den foretrukne måten er at du kan håndtere et objekt som definerer sin egen __eq__, og som definerer objektet å være lik Ingen. Så, alltid bruke foo is Nonehvis du trenger å se om det er infact None.

Svarte 28/05/2010 kl. 21:15
kilden bruker

stemmer
8

Det er ingen forskjell fordi gjenstander som er identiske, vil selvsagt være lik. Men PEP 8 sier klart du skal bruke is:

Sammenligninger til enkeltfødte som ingen bør alltid gjøres med er eller ikke er, aldri likestillings operatører.

Svarte 19/05/2013 kl. 15:35
kilden bruker

stemmer
5

istester for identitet, ikke likestilling. For din uttalelse foo is none, Python bare sammen minnet adressen til stedene. Det betyr at du stiller spørsmålet "Har jeg to navn for samme objekt?"

==på den annen side tester for likestilling som bestemt ved hjelp av __eq__()metoden. Det gjør ikke bryr seg om identitet.

In [102]: x, y, z = 2, 2, 2.0

In [103]: id(x), id(y), id(z)
Out[103]: (38641984, 38641984, 48420880)

In [104]: x is y
Out[104]: True

In [105]: x == y
Out[105]: True

In [106]: x is z
Out[106]: False

In [107]: x == z
Out[107]: True

Noneer a enkelt operatør. Så None is Noneer alltid sant.

In [101]: None is None
Out[101]: True
Svarte 19/12/2014 kl. 04:05
kilden bruker

stemmer
4

@ Jason :

Jeg anbefaler å bruke noe mer i retning av

if foo:
    #foo isn't None
else:
    #foo is None

Jeg liker ikke å bruke "hvis foo:" med mindre foo virkelig representerer en boolsk verdi (dvs. 0 eller 1). Hvis foo er en streng eller et objekt eller noe annet "hvis foo:" kan fungere, men det ser ut som en lat snarvei til meg. Hvis du sjekker for å se om x er ingen, sier "hvis x er None:".

Svarte 25/08/2008 kl. 21:35
kilden bruker

stemmer
4

For ingen bør det ikke være en forskjell mellom kjønnene (==) og identitet (er). Den NoneType returnerer trolig identitet for likestilling. Siden ingen er det eneste tilfellet kan du gjøre for NoneType (jeg tror dette er sant), de to operasjonene er de samme. Når det gjelder andre typer dette er ikke alltid tilfelle. For eksempel:

list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"

Dette vil skrive ut "Lik" siden lister har en sammenligning operasjon som ikke er standard retur av identitet.

Svarte 25/08/2008 kl. 19:04
kilden bruker

stemmer
2

Noen flere detaljer:

  1. Den isklausulen faktisk sjekker om de to objects er på samme minneplassen eller ikke. det vil si om de begge peker til samme minneområde og har samme id.

  2. Som en konsekvens av 1, issikrer hvorvidt eller ikke de to leksikalt representert objects har de samme attributter (attributter-of-attributter ...) eller ikke

  3. Oppretting av primitive typer som bool, int, string(med noen unntak), NoneTypehar en samme verdi vil alltid være i samme minneområde.

Eg

>>> int(1) is int(1)
True
>>> str("abcd") is str("abcd")
True
>>> bool(1) is bool(2)
True
>>> bool(0) is bool(0)
True
>>> bool(0)
False
>>> bool(1)
True

Og siden NoneTypekan bare ha én forekomst av seg selv i python er "look-up" table derfor førstnevnte og sistnevnte er mer av et programmerings stil av utvikleren som skrev koden (kanskje for konsistens) heller da å ha noen subtile logisk grunn til å velge en over den andre.

Svarte 19/05/2013 kl. 15:08
kilden bruker

stemmer
1

John Machin konklusjon om at Noneer en Singleton er en konklusjon styrket av denne koden.

>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>> 

Siden Noneer et enkelt, x == Noneog x is Noneville ha samme resultat. Men i min estetiske mening, x == Noneer best.

Svarte 27/03/2011 kl. 19:31
kilden bruker

stemmer
0
a is b # returns true if they a and b are true alias
a == b # returns true if they are true alias or they have values that are deemed equivalence 


a = [1,3,4]
b = a[:] #creating copy of list
a is b # if gives false
False
a == b # gives true
True
Svarte 03/04/2019 kl. 07:11
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more