Hvorfor giver sammenligning af strenge ved hjælp af enten '==' eller 'is' nogle gange et andet resultat?

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?

Løsning

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)

Kommentarer (12)

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.

Kommentarer (0)

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.

Kommentarer (2)