İki değişkenin 'public'
değerine ayarlandığı bir Python programım var. Koşullu bir ifadede var1 is var2
karşılaştırması başarısız oluyor, ancak bunu var1 == var2
olarak değiştirirsem True
döndürüyor.
Şimdi Python yorumlayıcımı açıp aynı "is" karşılaştırmasını yaparsam, başarılı olur.
>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True
Burada neyi kaçırıyorum?
iskimlik testidir,
==` eşitlik testidir. kodunuzda olanlar yorumlayıcıda şu şekilde taklit edilecektir:
>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False
Aynı olmamalarına şaşmamalı, değil mi?
Başka bir deyişle: is,
id(a) == id(b)`dir
isanahtar sözcüğü nesne kimliği için bir test iken,
==` bir değer karşılaştırmasıdır.
iskullanırsanız, sonuç yalnızca ve yalnızca nesne aynı nesne ise doğru olacaktır. Ancak,
==` nesnenin değerleri aynı olduğu her zaman doğru olacaktır.
Sanırım bu, 'is' karşılaştırması false olarak değerlendirildiğinde, iki farklı nesnenin kullanıldığı gerçeğiyle ilgili. Eğer true olarak değerlendirilirse, bu dahili olarak aynı nesneyi kullandığı ve yeni bir tane yaratmadığı anlamına gelir, çünkü muhtemelen onları 2 saniye kadar bir süre içinde yarattınız ve arada büyük bir zaman aralığı olmadığı için optimize edildi ve aynı nesneyi kullanıyor.
Bu nedenle, bir dize nesnesinin değerini karşılaştırmak için is
değil ==
eşitlik işlecini kullanmanız gerekir.
>>> s = 'one'
>>> s2 = 'two'
>>> s is s2
False
>>> s2 = s2.replace('two', 'one')
>>> s2
'one'
>>> s2 is s
False
>>>
Bu örnekte, farklı bir string nesnesi olan s2'yi daha önce 'one''a eşit yaptım, ancak s
ile aynı nesne değil, çünkü yorumlayıcı başlangıçta 'one''a atamadığım için aynı nesneyi kullanmadı, eğer yapsaydım onları aynı nesne yapardı.