is nesnelerin kimliğini karşılaştırır (yani değişkenlerin aynı bellek alanını işaret edip etmediği).== (operatör eq) değerleri karşılaştırır, yani nesnelerin içerik açısından eşit olup olmadığını kontrol eder.is kesinlikle kimlik karşılaştırması için (örneğin, None ile veya singleton nesneleri için) kullanılmalıdır, değer eşitliğini kontrol etmek için değil.
Örnek:
a = [1, 2, 3] b = [1, 2, 3] print(a == b) # True print(a is b) # False c = None d = None print(c is d) # True
Küçük tam sayılar veya dizelerle çalışırken, yorumlayıcı "içeride tutma" (cached objects) kullanabilir, bu nedenle eşit değerler için is bazen doğru olabilir, ancak bu programın mantığında kullanılmamalıdır.
Soru: Aşağıdaki kod ne yazdırır?
a = 256 b = 256 print(a is b) c = 257 d = 257 print(c is d)Neden?
Cevap:
-5 ile 256 arasındaki değerler için Python tam sayı havuzunu kullanır. Bu aralıktaki değerler her zaman aynı nesnelere işaret eder, bu nedenle a is b True verir. 257 ise havuzun dışındadır, bu nedenle c is d False olacaktır (nesneler bağımsızdır).
Tarih
Bir mikro hizmette, dizelerin eşitliğini is kullanarak karşılaştırdılar, == yerine. Yorumlayıcının optimizasyonları nedeniyle program testlerde "istikrarlı" çalıştı, ancak yeniden derleme veya ortam değişikliklerinden sonra çökme başladı.
Bir geliştirici sayıları karşılaştırmak için is operatörünü kullandı, == yerine. Bu küçük sayılar için işe yaradı (havuz sayesinde), ancak büyükler için—çökmelere ve öngörülemeyen sonuçlara neden oldu, bu da hesaplamalarda yanlış çalışmalara yol açtı.
Yetkilendirme sistemi tasarımında, gelen JSON'u is None ile doğru bir şekilde kontrol ettiler, sonra ise dizeler için de aynı şekilde yaptılar: if status is "ok". Bu bir hata oldu—bazen koşul gerçekleşmedi, bu da veri işleme mantığında yanlışlığa yol açtı.