Am observat un script Python scriam era incordat, și a urmărit-o buclă infinită, în cazul în care bucla condiție a fost în timp ce linia nu este ''
. Care trece prin ea in debugger, s-a dovedit că linia a fost de fapt''
. Când l-am schimbat cu!=''
mai degrabă decât nu este ''
, ea a lucrat bine.
De asemenea, este considerat, în general, mai bine să folosiți doar '==' în mod implicit, chiar și atunci când se compară int sau valori Booleene? Am'am plăcut întotdeauna să folosi 'este' pentru că mi se pare mai estetic plăcut și pythonic (care este modul în care am căzut în capcana asta...), dar mă întreb dacă-l's destinat să fie rezervate pentru atunci când îți pasă de constatare două obiecte cu aceeași identitate.
Pentru toate built-in Python obiecte (cum ar fi siruri de caractere, liste, previziuni, funcții, etc.), dacă x este y, atunci x==y este, de asemenea, Adevărat.
Nu întotdeauna. NaN este un contraexemplu. Dar de obicei, identitatea ("este") implică egalitatea (==
). Reciproca nu este adevărată: Două obiecte diferite pot avea aceeași valoare.
de Asemenea, este considerat, în general, mai bine să folosiți doar '==' în mod implicit, chiar atunci când se compară int sau valori Booleene?
Utilizați==
, atunci când se compară valorile și "este" atunci când se compară identități.
Atunci când se compară int (sau imuabil tipuri, în general), ai destul de mult întotdeauna vrei fostul. Nu's o optimizare care permite mici numere întregi pentru a fi comparat cu "este", dar nu't să se bazeze pe ea.
Pentru valori booleene, nu ar trebui't face comparații, la toate. În loc de:
if x == True:
# do something
scrie:
if x:
# do something
Pentru a compara împotriva "Nici unul", e Nimeni
este preferat == None
.
nu'am plăcut întotdeauna să folosi 'este' pentru că mi se pare mai estetic și pythonic (care este modul în care am căzut în această capcană...), dar mă întreb dacă-l's destinat să fie rezervate pentru atunci când vă interesează să găsesc două obiecte cu același id.
Da, asta's exact ceea ce-l's pentru.
Aș vrea să vă arăt un mic exemplu despre cum este
și ==
sunt implicate în tipuri imuabile. Incearca asta:
a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True
"este" compară două obiecte din memorie, ==
compară valorile lor. De exemplu, puteți vedea că mici numere întregi sunt memorate în cache de Python:
c = 1
b = 1
>>> b is c
True
Ar trebui să utilizați==
, atunci când se compară valorile și "este" atunci când se compară identități. (De asemenea, dintr-o engleză punct de vedere, "este egal" este diferit de la "este".)
Logica nu este eronată. Declarația
dacă x este y, atunci x==y este, de asemenea, Adevărat
ar trebui să nu să fie citit pentru a înțelege
dacă x==y, atunci x este y
Este o eroare logică, pe de o parte cititorului să presupunem că converse de o logica afirmatia este adevarata. A se vedea http://en.wikipedia.org/wiki/Converse_(logica)
A se vedea Această întrebare
Logica ta în lectură
Pentru toate built-in Python obiecte (cum ar fi siruri de caractere, liste, previziuni, funcții, etc.), dacă x este y, atunci x==y este, de asemenea, Adevărat.
este ușor greșită.
Dacă "este" se aplică atunci ==
va fi Adevărat, dar NU se aplică în sens invers. ==
poate produce Adevărate în timp ce "este" dă False.