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 is
bij 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 None
de 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 is
en ==
betrokken zijn bij onveranderlijke typen. Probeer dat eens:
a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True
is
vergelijkt 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 is
bij 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 is
van toepassing is, dan is ==
waar, maar het is NIET omgekeerd. ==
kan True opleveren, terwijl is
False oplevert.