Waarom geeft het vergelijken van strings met '==' of 'is' soms een ander resultaat?

Ik'heb een Python programma waar twee variabelen zijn ingesteld op de waarde 'public'. In een voorwaardelijke expressie heb ik de vergelijking var1 is var2 die mislukt, maar als ik het verander in var1 == var2 retourneert het True.

Als ik nu mijn Python interpreter open en dezelfde "is" vergelijking doe, slaagt het.

>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True

Wat zie ik hier over het hoofd?

Oplossing

is is identiteit testen, == is gelijkheid testen. wat er in jouw code gebeurt, wordt in de interpreter als volgt geëmuleerd:

>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False

Dus, geen wonder dat ze niet hetzelfde zijn, toch?

Met andere woorden: is is het id(a) == id(b)

Commentaren (12)

Het is sleutelwoord is een test voor object identiteit terwijl == een waarde vergelijking is.

Als je is gebruikt, zal het resultaat waar zijn als en slechts als het object hetzelfde object is. Echter, == zal waar zijn elke keer als de waarden van de objecten hetzelfde zijn.

Commentaren (0)

Ik denk dat het te maken heeft met het feit dat, wanneer de 'is'-vergelijking op false uitdraait, er twee verschillende objecten worden gebruikt. Als het evalueert naar waar, betekent dat intern dat het precies hetzelfde object gebruikt en geen nieuwe aanmaakt, mogelijk omdat je ze binnen een fractie van 2 of zo seconden hebt aangemaakt en omdat er'geen groot tijdsverschil tussen zit, is het geoptimaliseerd en gebruikt het hetzelfde object.

Dit is de reden waarom je de gelijkheidsoperator == moet gebruiken, niet is, om de waarde van een stringobject te vergelijken.

>>> s = 'one'
>>> s2 = 'two'
>>> s is s2
False
>>> s2 = s2.replace('two', 'one')
>>> s2
'one'
>>> s2 is s
False
>>> 

In dit voorbeeld heb ik s2, wat een ander string object was eerder gelijk gemaakt aan 'one' maar het is niet hetzelfde object als s, omdat de interpreter niet hetzelfde object heeft gebruikt omdat ik het in eerste instantie niet heb toegewezen aan 'one' als ik dat had gedaan zou het ze hetzelfde object hebben gemaakt.

Commentaren (2)