Comparație șir în Python: este vs ==

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.

Comentarii la întrebare (3)
Soluția

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.

Comentarii (18)

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".)

Comentarii (4)

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)

Comentarii (2)

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.

Comentarii (2)