Imam program v Pythonu, v katerem sta dve spremenljivki nastavljeni na vrednost 'public'
. V pogojnem izrazu imam primerjavo var1 je var2
, ki je neuspešna, če pa jo spremenim v var1 == var2
, se vrne True
.
Če zdaj odprem prevajalnik Pythona in naredim isto primerjavo, je ta uspešna.
>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True
Kaj sem spregledal?
is
je testiranje identitete, ==
je testiranje enakosti. to, kar se zgodi v vaši kodi, bi bilo v prevajalniku posnemano takole:
>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False
zato ni čudno, da nista enaka, kajne?
Z drugimi besedami: je
je id(a) == id(b)
Ključna beseda is
je preizkus identitete objekta, medtem ko je ==
primerjava vrednosti.
Če uporabite is
, bo rezultat resničen, če in samo če je objekt isti objekt. Vendar pa bo ==
resničen vedno, ko sta vrednosti objekta enaki.
Menim, da je to povezano z dejstvom, da se pri primerjavi 'is', ki se ovrednoti z false, uporabljata dva različna predmeta. Če se ovrednoti z true, to pomeni, da interno uporablja natanko isti objekt in ne ustvarja novega, morda zato, ker ste ju ustvarili v približno dveh sekundah in ker med njima ni velike časovne razlike, je optimizirano in uporablja isti objekt.
Zato bi morali za primerjavo vrednosti objekta z nizom uporabljati operator enakosti ==
in ne is
.
>>> s = 'one'
>>> s2 = 'two'
>>> s is s2
False
>>> s2 = s2.replace('two', 'one')
>>> s2
'one'
>>> s2 is s
False
>>>
V tem primeru sem s2, ki je bil prej drug objekt nizov, naredil enak 'ena', vendar ni isti objekt kot s
, ker prevajalnik ni uporabil istega objekta, saj ga na začetku nisem dodelil 'ena', če bi ga, bi ju naredil za isti objekt.