Poate doriți să citiți acest obiect de identitate și echivalența.

Declarația 'este' este folosit pentru obiecte de identitate, se verifică dacă obiectele se referă la aceeași instanță (aceeași adresă în memorie).

Și '==' declarația se referă la egalitate (de aceeași valoare).

Un cuvânt de precauție:

if foo:
  # do something

E nu exact la fel ca:

if x is not None:
  # do something

Prima este o valoare booleană de testare și poate evalua la fals în diferite contexte. Există o serie de lucruri care reprezintă false într-o valoare booleană testele de exemplu containere goale, valori booleene. Niciunul, de asemenea, se evaluează la false în această situație, dar alte lucruri nu prea.

Motivul foo este Nici unul este calea preferată este că s-ar putea ocupa de un obiect care definește propria __eq__, și care definește obiectul să fie egal cu Nici unul. Deci, utilizați întotdeauna foo este Nici unul dacă ai nevoie de pentru a vedea dacă acesta este de fapt "Nici unul".

(ob1 este ob2) egal (id(ob1) == id(ob2))

Nu există nici o diferență pentru că obiectele care sunt identice, desigur, va fi egal. Cu toate acestea, PEP 8 prevede în mod clar că ar trebui să utilizați "este":

Comparații cu singletons ca Nimeni nu ar trebui să fie întotdeauna făcut cu este sau nu este, nu egalitatea operatori.

"este" teste de identitate, nu egalitatea de șanse. Pentru declarația ta foo este none, Python pur și simplu compară adresa de memorie de obiecte. Asta înseamnă că îți pui întrebarea "am două nume pentru același obiect?"

== pe de altă parte, testele pentru egalitatea determinate de `eq () metodă. Nu't-i pasă de identitate.

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

"Nimic" este un singleton operator. Deci Nici unul nu este Nici unul nu este întotdeauna adevărat.

In [101]: None is None
Out[101]: True

Pentru Nici unul nu ar trebui't fi o diferență între egalitate (==) și identitatea (e). La NoneType probabil se întoarce de identitate pentru egalitate. Deoarece Nici unul nu este singurul exemplu, puteți face de NoneType (cred că acest lucru este adevărat), cele două operațiuni sunt la fel. În cazul altor tipuri de acest lucru nu este întotdeauna cazul. De exemplu:

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

Acest lucru ar print "Egal", deoarece listele avea un termen de comparație operațiune care nu este implicit revenirea de identitate.

@Jason:

am recomandăm să utilizați ceva mai mult de-a lungul liniilor de

dacă foo:

foo e't Nici unul

else:
    #foo is None

Eu nu't ca folosind "dacă foo:" dacă foo reprezintă cu adevărat o valoare booleană (de exemplu 0 sau 1). Dacă foo este un string sau un obiect sau altceva, "dacă foo:" poate lucra, dar se pare ca un leneș comandă rapidă pentru mine. Daca're de verificare pentru a vedea dacă x este Nici unul, spun "dacă x este Nici unul:".

Mai multe detalii:

  1. A "este" clauza de fapt verifică dacă două obiecte sunt în același locație de memorie sau nu. eu.e dacă ambele au același locație de memorie și au aceeași "id".

  2. Ca o consecință a 1, "este" asigură fie, sau nu, cele două lexical reprezentat `obiect au atribute identice (atribute-de-atribute...) sau nu

  3. Instanțierea de tipuri primitive ca bool, int, string(cu unele excepții), NoneType având o aceeași valoare va fi întotdeauna în aceeași locație de memorie.

E. g.

>>> 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

Și din NoneType poate avea doar un singur exemplu de sine în python's "uite-up" masa, prin urmare, cele dintâi și cele din urmă sunt mai mult un stil de programare de dezvoltator care a scris codul(poate pentru consistență), mai degrabă apoi cu orice subtile motiv logic de a alege unul peste celălalt.

John Machin's concluzia că "Nici unul" este un singleton este o concluzie susținută de prezentul cod.

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

Din "Nimic" este un singleton, x == None " și " x este Nici unul nu ar avea același rezultat. Cu toate acestea, în estetice opinia,x == None` este cel mai bun.

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
Întrebări asemănătoare