Python'da dize karşılaştırması: is vs. ==

Yazdığım bir Python betiğinin tuhaf davrandığını fark ettim ve döngü koşulunun while line is not '' olduğu sonsuz bir döngünün izini sürdüm. Hata ayıklayıcıda çalıştırdığımda, o satırın aslında '' olduğu ortaya çıktı. Bunu is not '' yerine !='' olarak değiştirdiğimde, sorunsuz çalıştı.

Ayrıca, int veya Boolean değerleri karşılaştırırken bile varsayılan olarak sadece '==' kullanmak genellikle daha mı iyi kabul edilir? Ben her zaman 'is' kullanmayı sevmişimdir çünkü bunu daha estetik ve pythonic buluyorum (bu tuzağa nasıl düştüm...), ancak aynı id'ye sahip iki nesneyi bulmayı önemsediğinizde bunun sadece ayrılmış olması mı amaçlanıyor merak ediyorum.

Çözüm

Tüm yerleşik Python nesneleri için (örneğin stringler, listeler, dicts, fonksiyonlar, vb.), eğer x y ise, o zaman x==y de Doğru.

Her zaman değil. NaN bir karşı örnektir. Ancak genellikle, özdeşlik (is) eşitlik (==) anlamına gelir. Tersi doğru değildir: İki farklı nesne aynı değere sahip olabilir.

Ayrıca, varsayılan olarak sadece '==' kullanmak genellikle daha mı iyi kabul edilir? int veya Boolean değerleri karşılaştırırken >?

Değerleri karşılaştırırken ==, özdeşlikleri karşılaştırırken is kullanırsınız.

İnt'leri (veya genel olarak değişmez türleri) karşılaştırırken, hemen hemen her zaman ilkini istersiniz. Küçük tamsayıların is ile karşılaştırılmasına izin veren bir optimizasyon vardır, ancak buna güvenmeyin.

Boolean değerler için karşılaştırma yapmamanız gerekir. Bunun yerine:

if x == True:
    # do something

Yaz:

if x:
    # do something

Noneile karşılaştırmak için== Noneyerineis None` tercih edilir.

'is' kullanmayı her zaman sevmişimdir; çünkü Estetik açıdan daha hoş buluyorum ve pitonik (ki ben de bu şekilde bu tuzak...), ama merak ediyorum acaba sadece ne zaman için ayrılmış olması amaçlanmıştır iki nesne bulmayı önemsiyorsunuz aynı kimlik ile.

Evet, tam olarak bunun için.

Yorumlar (18)

Değişmez tiplerde is ve == nin nasıl yer aldığına dair küçük bir örnek göstermek istiyorum. Bunu deneyin:

a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True

isbellekteki iki nesneyi karşılaştırır,==` ise bunların değerlerini karşılaştırır. Örneğin, küçük tamsayıların Python tarafından önbelleğe alındığını görebilirsiniz:

c = 1
b = 1
>>> b is c
True

Değerleri karşılaştırırken == ve özdeşlikleri karşılaştırırken is kullanmalısınız. (Ayrıca, İngilizce bakış açısından, "equals", "is"'den farklıdır).

Yorumlar (4)

Bkz Bu soru

Okuma mantığınız

Tüm yerleşik Python nesneleri için (örneğin stringler, listeler, dicts, fonksiyonlar, vb.), eğer x y ise, o zaman x==y de Doğru.

biraz kusurlu.

Eğer is geçerliyse, == Doğru olacaktır, ancak tersi geçerli DEĞİLDİR. isdeğeri False verirken==` değeri True verebilir.

Yorumlar (2)