Başka bir kopya , iki eşit dizgenin genel olarak neden aynı olmadığını soruyordu, bu da burada gerçekten cevaplanmıyor:
>>> x = 'a'
>>> x += 'bc'
>>> y = 'abc'
>>> x == y
True
>>> x is y
False
Peki neden aynı dizge değiller? Özellikle bu göz önüne alındığında:
>>> z = 'abc'
>>> w = 'abc'
>>> z is w
True
İkinci bölümü biraz erteleyelim. İlki nasıl doğru olabilir?
Yorumlayıcının bir "interning tablosu", yani dizgi değerlerini dizgi nesnelerine eşleyen bir tablo olması gerekir, böylece içerikle her yeni bir dizgi oluşturmaya çalıştığınızda 'abc'
, aynı nesneyi geri alırsınız. Wikipedia'da staj yapmanın nasıl çalıştığına dair daha ayrıntılı bir tartışma var.
Ve Python vardır tabloyu interning bir dize; sys.intern
yöntemle dizeleri manuel olarak interneti yapabilirsiniz .
Aslında, Python'un herhangi bir değişmez türü otomatik olarak staj yapmasına izin verilir , ancak bunu yapması zorunlu değildir . Farklı uygulamalar, farklı değerler içerecektir.
CPython (hangi uygulamayı kullandığınızı bilmiyorsanız, kullandığınız uygulama) otomatik olarak küçük tamsayılar ve bazı özel tekler gibi False
dizeler (veya büyük tam sayılar veya küçük tupllar veya başka herhangi bir şey) değil. Bunu oldukça kolay görebilirsiniz:
>>> a = 0
>>> a += 1
>>> b = 1
>>> a is b
True
>>> a = False
>>> a = not a
>>> b = True
a is b
True
>>> a = 1000
>>> a += 1
>>> b = 1001
>>> a is b
False
Tamam, ama neden olduğunu z
ve w
aynı?
Bu otomatik olarak yorumlayıcı değil, derleyici katlama değerleri.
Aynı derleme zamanı dize (aynı modülde iki kez görünürse tam olarak ne bu araçlar, çünkü bir dize ile aynı şey değil o tanımlamak zordur r'abc'
, 'abc'
ve 'a' 'b' 'c'
anlaşılması kolay tüm farklı değişmezleri ama aynı dize ancak sezgisel olarak), derleyici iki referansla dizenin yalnızca bir örneğini oluşturur.
Aslında, derleyici daha da ileri gidebilir: optimizer tarafından 'ab' + 'c'
dönüştürülebilir 'abc'
, bu durumda 'abc'
aynı modülde bir sabitle birlikte katlanabilir .
Yine, bu Python'a izin verilen ancak yapılması zorunlu olmayan bir şeydir. Ancak bu durumda, CPython her zaman küçük dizeleri (ve ayrıca, örneğin, küçük dizeleri) katlar. (Etkileşimli yorumlayıcının ifade-bazında derleyici, tek seferde modül derleyici ile aynı optimizasyonu çalıştırmasa da, tam olarak aynı sonuçları etkileşimli olarak görmezsiniz.)
Peki bir programcı olarak bu konuda ne yapmalısınız?
Şey ... hiçbir şey. İki değişmez değerin aynı olup olmadığını umursamak için neredeyse hiçbir nedeniniz yoktur. a is b
Bunun yerine ne zaman kullanabileceğinizi bilmek istiyorsanız a == b
, yanlış soruyu soruyorsunuz. a == b
İki durum dışında her zaman kullanın :
- Tekil değerlerle daha okunaklı karşılaştırmalar için
x is None
.
- Bilmeniz gereken zaman değişken değerleri için değişen yapısıyla olmadığını
x
etkileyecektir y
.