Jeg har et Python-program, hvor to variabler er sat til værdien 'public'
. I et betinget udtryk har jeg sammenligningen var1 is var2
som fejler, men hvis jeg ændrer den til var1 == var2
returnerer den True
.
Hvis jeg nu åbner min Python-fortolker og laver den samme "is" sammenligning, lykkes det.
>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True
Hvad er det, jeg går glip af her?
is
er identitetstest, ==
er lighedstest. det, der sker i din kode, vil blive emuleret i fortolkeren på følgende måde:
>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False
så det er ikke så underligt, at de ikke er ens, vel?
Med andre ord: er er
er id(a) == id(b)
Nøgleordet is
er en test for objektets identitet, mens ==
er en sammenligning af værdier.
Hvis du bruger is
, vil resultatet være sandt, hvis og kun hvis objektet er det samme objekt. Men ==
vil være sandt, når objektets værdier er de samme.
Jeg tror, at det har noget at gøre med, at når sammenligningen 'is' evalueres til false, bruges to forskellige objekter. Hvis den evaluerer til true, betyder det internt, at den internt bruger nøjagtigt det samme objekt og ikke opretter et nyt, muligvis fordi du har oprettet dem inden for en brøkdel af 2 sekunder eller deromkring, og fordi der ikke er et stort tidsrum imellem, er den optimeret og bruger det samme objekt.
Derfor skal du bruge lighedsoperatoren ==
, ikke is
, til at sammenligne værdien af et strengobjekt.
>>> s = 'one'
>>> s2 = 'two'
>>> s is s2
False
>>> s2 = s2.replace('two', 'one')
>>> s2
'one'
>>> s2 is s
False
>>>
I dette eksempel gjorde jeg s2, som tidligere var et andet stringobjekt, lig med 'one' men det er ikke det samme objekt som s
, fordi fortolkeren ikke brugte det samme objekt, da jeg ikke oprindeligt tildelte det til 'one', hvis jeg havde gjort det, ville det have gjort dem til det samme objekt.