Minulla on Python-ohjelma, jossa kaksi muuttujaa on asetettu arvoon 'public'
. Ehdollisessa lausekkeessa minulla on vertailu var1 on var2
, joka epäonnistuu, mutta jos muutan sen var1 == var2
:ksi, se palauttaa True
.
Jos nyt avaan Python-tulkin ja teen saman "on" -vertailun, se onnistuu.
>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True
Mitä minulta on jäänyt huomaamatta?
is
on identiteettitestausta, ==
on tasa-arvotestausta. se, mitä koodissasi tapahtuu, jäljitettäisiin tulkissa näin:
>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False
joten ei ihme, etteivät ne ole samanlaisia, vai mitä?
Toisin sanoen: is
on id(a) == id(b)
.
Luulen, että se liittyy siihen, että kun 'is' -vertailu on false, käytetään kahta eri objektia. Jos vertailun arvoksi tulee true, se tarkoittaa, että sisäisesti se käyttää täsmälleen samaa objektia eikä luo uutta, mahdollisesti siksi, että olet luonut ne noin 2 sekunnin murto-osan sisällä ja koska niiden välillä ei ole suurta aikaväliä, se on optimoitu ja käyttää samaa objektia.
Tämän takia sinun pitäisi käyttää tasa-arvooperaattoria ==
, ei is
, vertaillaksesi merkkijono-objektin arvoa.
>>> s = 'one'
>>> s2 = 'two'
>>> s is s2
False
>>> s2 = s2.replace('two', 'one')
>>> s2
'one'
>>> s2 is s
False
>>>
Tässä esimerkissä tein s2:sta, joka oli aiemmin eri merkkijono-objekti, samanarvoisen kuin 'one', mutta se ei ole sama objekti kuin s
, koska tulkki ei käyttänyt samaa objektia, koska en alun perin osoittanut sitä 'one':lle, jos olisin osoittanut, se olisi tehnyt niistä saman objektin.