Arasında bir fark var mı ==
ve is
Python?
Evet, çok önemli bir farkları var.
==
: eşitliği kontrol edin - anlambilim, eşdeğer nesnelerin (mutlaka aynı nesne olması gerekmez) eşit olarak test edileceğidir. Gibi belgeler diyor :
<,>, ==,> =, <= ve! = İşleçleri iki nesnenin değerlerini karşılaştırır.
is
: Kimlik kontrol - semantik (bellekte tutulan) bir amacı da bulunmaktadır olan nesne. Yine, belgeler diyor ki :
İşleçler is
ve is not
nesne kimliği testi: x is y
yalnızca x
ve y
aynı nesne ise ve doğruysa doğrudur . Nesne kimliği id()
fonksiyon kullanılarak belirlenir . x is not y
ters doğruluk değeri verir.
Böylece, kimlik kontrolü, nesnelerin kimliklerinin eşitliğini kontrol etmekle aynıdır. Yani,
a is b
aynıdır:
id(a) == id(b)
id
"eşzamanlı olarak varolan nesneler arasında benzersiz olması garanti edilen" bir tamsayı döndüren yerleşik işlev nerede (bkz. help(id)
) ve isteğe bağlı nesneler nerede a
ve b
vardır.
Diğer Kullanım Talimatları
Bu karşılaştırmaları anlambilimleri için kullanmalısınız. is
Kimliği ve ==
eşitliği kontrol etmek için kullanın .
Genel olarak, is
kimliği kontrol etmek için kullanırız . Bu genellikle, yalnızca bir kez bellekte bulunması gereken ve belgelerde "singleton" olarak adlandırılan bir nesneyi kontrol ederken kullanışlıdır.
Kullanım örnekleri is
şunları içerir:
None
- enum değerleri (enum modülünden Enum'lar kullanılırken)
- genellikle modüller
- genellikle sınıf tanımlarından kaynaklanan sınıf nesneleri
- genellikle işlev tanımlarından kaynaklanan işlev nesneleri
- bellekte sadece bir kez olması gereken her şey (genellikle tüm tektonlar)
- kimlikle istediğiniz belirli bir nesne
Her zamanki kullanım örnekleri ==
şunları içerir:
- tamsayılar dahil sayılar
- Teller
- listeleri
- kümeler
- sözlükleri
- özel değiştirilebilir nesneler
- çoğu zaman yerleşik yerleşik olmayan nesneler, çoğu durumda
Genel kullanım örneği, yine, ==
istediğiniz nesne aynı nesne olmayabilir, bunun yerine eşdeğer bir nesne olabilir
PEP 8 yol tarifi
Standart kütüphane için resmi Python stil rehberi olan PEP 8 ayrıca aşağıdakiler için iki kullanım durumundanis
bahseder :
Gibi tektonlarla karşılaştırmalar None
daima eşitlik operatörleri ile is
veya
is not
asla yapılmamalıdır .
Ayrıca, if x
gerçekten demek istediğinizde yazmamaya dikkat edin if x is not None
- örneğin, varsayılan olarak bir değişkenin veya bağımsız değişkenin None
başka bir değere ayarlanıp ayarlanmadığını test ederken . Diğer değer, bir boole bağlamında yanlış olabilecek bir türe (kap gibi) sahip olabilir!
Eşitliği kimlikten çıkarmak
Eğer is
doğruysa, eşitlik olabilir genellikle çıkarılabilir - bir nesnenin kendisine ise mantıksal olarak, o zaman kendisine eşdeğer olarak test etmelidir.
Çoğu durumda bu mantık doğrudur, ancak __eq__
özel yöntemin uygulanmasına dayanır . Gibi dokümanlar demek,
Eşitlik karşılaştırması ( ==
ve !=
) için varsayılan davranış , nesnelerin kimliğine dayanır. Dolayısıyla, aynı kimliğe sahip örneklerin eşitlik karşılaştırması eşitlikle sonuçlanır ve farklı kimliklere sahip örneklerin eşitlik karşılaştırması eşitsizliğe yol açar. Bu varsayılan davranış için bir motivasyon, tüm nesnelerin refleksif olma arzusudur (yani x, y = x y anlamına gelir).
ve tutarlılık için şunları tavsiye eder:
Eşitlik karşılaştırması dönüşlü olmalıdır. Başka bir deyişle, özdeş nesneler eşittir:
x is y
ima x == y
Bunun özel nesneler için varsayılan davranış olduğunu görebiliriz:
>>> class Object(object): pass
>>> obj = Object()
>>> obj2 = Object()
>>> obj == obj, obj is obj
(True, True)
>>> obj == obj2, obj is obj2
(False, False)
Kontraseptif de genellikle doğrudur - eğer bir şey eşit değilse test ederse, genellikle aynı nesne olmadıklarını çıkarabilirsiniz.
Eşitlik testleri özelleştirilebildiğinden, bu çıkarım tüm tipler için her zaman geçerli değildir.
Bir istisna
Dikkate değer bir istisna nan
- her zaman kendine eşit olmadığı test eder:
>>> nan = float('nan')
>>> nan
nan
>>> nan is nan
True
>>> nan == nan # !!!!!
False
Kimlik kontrolü, eşitliği kontrol etmekten çok daha hızlı bir kontrol olabilir (üyelerin tekrar tekrar kontrol edilmesini gerektirebilir).
Ancak, eşit olarak birden fazla nesne bulabileceğiniz eşitlik yerine kullanılamaz.
Liste ve grupların eşitliğinin karşılaştırılmasının, nesnelerin kimliğinin eşit olduğunu varsayacağını unutmayın (çünkü bu hızlı bir kontroldür). Bu, mantık tutarsızsa çelişkiler yaratabilir - olduğu gibi nan
:
>>> [nan] == [nan]
True
>>> (nan,) == (nan,)
True
Dikkatli Bir Masal:
Soru, is
tam sayıları karşılaştırmak için kullanmaya çalışıyor . Bir tamsayı örneğinin başka bir başvuru tarafından alınan örnekle aynı olduğunu varsaymamalısınız. Bu hikaye nedenini açıklıyor.
Bir yorumcunun eşitliği kontrol etmek yerine küçük tamsayıların (-5 ila 256 dahil) Python'da tekton olduğuna güvenen bir kodu vardı.
Vay be, bu bazı sinsi böceklere yol açabilir. Ben a ve b genellikle küçük sayılar olduğundan istediğim gibi çalıştı b b, kontrol bazı kod vardı. Böcek sadece bugün, altı ay üretimden sonra oldu, çünkü a ve b nihayet önbelleğe alınamayacak kadar büyüktü. - gwg
Geliştirmede çalıştı. Bazı birim testlerden geçmiş olabilir.
Ve üretimde çalıştı - kod 256'dan büyük bir tamsayı kontrol edene kadar, bu noktada üretimde başarısız oldu.
Bu, kod incelemesinde veya muhtemelen bir stil denetleyicisiyle yakalanmış olabilecek bir üretim hatasıdır.
Vurgulayayım: tamsayıları karşılaştırmak için kullanmayın is
.
echo 'import sys;tt=sys.argv[1];print(tt is "foo", tt == "foo", id(tt)==id("foo"))'| python3 - foo
çıktı:False True False
.