Sammenligning af strenge i Python: is vs. ==
Jeg bemærkede, at et Python-script, som jeg var ved at skrive, opførte sig underligt, og sporede det til en uendelig løkke, hvor løkkebetingelsen var while line is not ''
. Da jeg kørte det igennem i debuggeren, viste det sig, at linjen faktisk var ''
. Da jeg ændrede den til !='''
i stedet for is not '''
, virkede det fint.
Er det generelt set også bedre at bruge '==' som standard, selv når man sammenligner int- eller boolske værdier? I've always liked to use 'is' because I find it more aesthetically pleasing and pythonic (which is how I fell into this trap...), but I wonder if it's intended to just be reserved for when you care about finding two objects with the same id.
519
3
Ikke altid. NaN er et modeksempel. Men normalt forudsætter identitet (
er
) lighed (==
). Det omvendte er ikke sandt: To forskellige objekter kan have samme værdi.Man bruger
==
når man sammenligner værdier ogis
når man sammenligner identiteter.Når du sammenligner ints (eller uforanderlige typer generelt), vil du stort set altid bruge førstnævnte. Der findes en optimering, der gør det muligt at sammenligne små integers med
is
, men du skal ikke stole på den.For boolske værdier bør du slet ikke foretage sammenligninger. I stedet for:
write:
Ved sammenligning mod
None
eris None
at foretrække frem for== None
.Ja, det er præcis det, den er beregnet til.
Jeg vil gerne vise et lille eksempel på, hvordan
is
og==
er involveret i uforanderlige typer. Prøv det:is
sammenligner to objekter i hukommelsen,==
sammenligner deres værdier. Du kan f.eks. se, at små hele tal lagres i cachen af Python:Du bør bruge
==
når du sammenligner værdier ogis
når du sammenligner identiteter. (Fra et engelsk synspunkt er "equals" også forskelligt fra "is").Se Dette spørgsmål
Din logik ved læsning
er lidt mangelfuld.
Hvis
is
gælder, så er==
sandt, men det gælder IKKE omvendt.==
kan give True, mensis
giver False.