Stringvergelijking in Python: is vs. ==

Ik merkte dat een Python-script dat ik aan het schrijven was squirrelly gedroeg, en herleidde het naar een oneindige lus, waar de lusvoorwaarde was while line is not ''is. Toen ik het in de debugger doorliep, bleek die regel in feite ''te zijn. Toen ik het veranderde in !=''in plaats van is not '', werkte het prima.

Wordt het ook over het algemeen als beter beschouwd om standaard ‘==’ te gebruiken, zelfs bij het vergelijken van int- of Booleaanse waarden? Ik heb altijd graag ‘is’ gebruikt omdat ik het esthetisch aantrekkelijker en pythonischer vind (en zo ben ik in deze val gelopen…), maar ik vraag me af of het bedoeld is om alleen te worden gereserveerd voor als je er twee wilt vinden objecten met dezelfde id.


Antwoord 1, autoriteit 100%

Voor alle ingebouwde Python-objecten (zoals
strings, lijsten, dicts, functies,
enz.), als x y is, dan is x==y ook
Waar.

Niet altijd. NaN is een tegenvoorbeeld. Maar meestalimpliceert identiteit (is) gelijkheid (==). Het omgekeerde is niet waar: twee verschillende objecten kunnen dezelfde waarde hebben.

Ook, wordt het over het algemeen als beter beschouwd om standaard ‘==’ te gebruiken, zelfs
bij het vergelijken van int of Booleaanse waarden?

Je gebruikt ==bij het vergelijken van waarden en isbij het vergelijken van identiteiten.

Bij het vergelijken van ints (of onveranderlijke typen in het algemeen), wil je vrijwel altijd het eerste. Er is een optimalisatie waarmee kleine gehele getallen kunnen worden vergeleken met is, maar vertrouw er niet op.

Voor booleaanse waarden zou u helemaal geen vergelijkingen moeten maken. In plaats van:

if x == True:
    # do something

schrijf:

if x:
    # do something

Voor het vergelijken met None, heeft is Nonede voorkeur boven == None.

Ik heb altijd graag ‘is’ gebruikt omdat
Ik vind het esthetisch mooier
en pythonisch (en zo ben ik gevallen)
deze val…), maar ik vraag me af of dat zo is
bedoeld om alleen te worden gereserveerd voor wanneer
je geeft om het vinden van twee objecten
met dezelfde id.

Ja, daar is het precies voor.


Antwoord 2, autoriteit 41%

Ik wil graag een klein voorbeeld laten zien van hoe isen ==betrokken zijn bij onveranderlijke typen. Probeer dat eens:

a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True

isvergelijkt twee objecten in het geheugen, ==vergelijkt hun waarden. U kunt bijvoorbeeld zien dat kleine gehele getallen in de cache worden opgeslagen door Python:

c = 1
b = 1
>>> b is c
True

U moet ==gebruiken bij het vergelijken van waarden en isbij het vergelijken van identiteiten. (Ook vanuit Engels oogpunt is “gelijk aan” anders dan “is”.)


Antwoord 3, autoriteit 11%

De logica is niet gebrekkig. De verklaring

als x y is, dan is x==y ook waar

mag nooitworden gelezen als

als x==y dan is x y

Het is een logische fout van de lezer om aan te nemen dat het omgekeerde van een logische verklaring waar is. Zie http://en.wikipedia.org/wiki/Converse_(logic)


Antwoord 4, autoriteit 4%

Zie Deze vraag

Uw logica bij het lezen

Voor alle ingebouwde Python-objecten (zoals
strings, lijsten, dicts, functies,
enz.), als x y is, dan is x==y ook
Waar.

is enigszins gebrekkig.

Als isvan toepassing is, dan is ==waar, maar het is NIET omgekeerd. ==kan True opleveren, terwijl isFalse oplevert.

Other episodes