Python Yok karşılaştırması: “is” veya == kullanmalı mıyım?


213

Editörüm karşılaştırdığımda beni uyarıyor my_var == Noneama kullandığımda uyarı yok my_var is None.

Python kabuğunda bir test yaptım ve her ikisinin de geçerli sözdizimi olduğunu belirledim, ancak editörüm my_var is Nonebunun tercih edildiğini söylüyor gibi görünüyor .

Durum böyle mi, eğer öyleyse neden?


7
PEP 8, bir yerde şunu kullanarak singletonlarla karşılaştırmanız gerektiğini söylüyor is- python.org/dev/peps/pep-0008/#programming-recommendations
Volatility

2
Bu poster Python 3 hakkında konuşuyor ve sorum Python 2.x hakkında. Bunun her ikisinin de kalanını garanti etmek için yeterince büyük bir fark olup olmadığından emin değilim ama her ihtimale karşı soruyu düzenledim.
Clay Wardell

2
Bu sorunun gerçekten bir kopyası olduğunu düşünmüyorum. Diğeri ise genel olarak == vs, bu özellikle Yok hakkındaydı.
IJ Kennedy

Yanıtlar:


254

Özet:

isBir nesnenin kimliğine karşı kontrol etmek istediğinizde kullanın (örneğin var, olup olmadığını kontrol etmek None). Eşitliği== kontrol etmek istediğinizde kullanın (örneğin Eşit mi?).var3

Açıklama:

my_var == NoneGeri döneceğiniz özel sınıflarınız olabilirTrue

Örneğin:

class Negator(object):
    def __eq__(self,other):
        return not other

thing = Negator()
print thing == None    #True
print thing is None    #False

isnesne kimliğini kontrol eder . Sadece 1 nesne var None, bu yüzden yaptığınızda my_var is None, aslında aynı nesne olup olmadıklarını kontrol ediyorsunuz (sadece eşdeğer nesneler değil )

Başka bir deyişle, ==eşdeğerlik kontrolü (nesneden nesneye tanımlanır), oysa isnesne kimliğini kontrol eder:

lst = [1,2,3]
lst == lst[:]  # This is True since the lists are "equivalent"
lst is lst[:]  # This is False since they're actually different objects

22
Ne zaman is Nonefarklıdır == None?
Blender

11
@Blender Belirtilen davada. __eq__herhangi bir şekilde tanımlanabilir, ancak davranışı isbu kadar kolay değiştirilemez.
Lev Levitsky

5
@LevLevitsky: Mython'un örnek kullanımlarından biri "herhangi bir operatörün aşırı yüklenebilmesi için protokollerin genişletilmesi is" idi. Listeler hakkında yorum yaptıktan sonra, bunu "... hatta is(ama sadece deli iseniz)" olarak değiştirdi.
abarnert

1
+1, ancak bu cevabın diğerlerinin yaptığı PEP 8 referansını içermesi daha iyi olurdu (ve PEP 8'in arkasındaki kararın neden mantıklı olduğunu açıklamakta olduğu gibi).
abarnert

3
@abarnert - PEP 8'in burada bir tavsiyede bulunduğunun farkında bile değildim. Mesele şu ki, farklı şeyler yapan farklı operatörler. Durumlar olabilir object == Noneaslında olduğu (kafamın üst kapalı herhangi düşünemiyorum bile) doğru deyim. Sadece ne yaptığını bilmen gerek.
mgilson

127

isgenellikle Nonedaha hızlı ve daha öngörülebilir olduğu için keyfi nesneler gibi tektonlarla karşılaştırılırken tercih edilir . isher zaman nesne kimliğiyle karşılaştırılırken ==, yapılacak olan işlenenlerin tam türüne ve hatta sıralarına bağlıdır.

Bu öneri PEP 8 tarafından desteklenmektedir. , açıkça belirtmektedir o "Yok böyle tekiz karşılaştırmalar hep birlikte yapılmalıdır isya is not, asla eşitlik operatörleri."


6
Bunu gönderdiğiniz için teşekkürler; kabul edilen cevap bazı ilginç noktalara işaret eder, ancak sizinki soruya çok daha doğrudan yanıt verir.
Luke Davis

Temelde bir uygulama detayına güvenmek garip görünüyor. Neden NoneType'ın kaç örneğinin olduğunu umursamalıyım?
BallpointBen

@BallpointBen Bir uygulama detayı olmadığı için - Noneglobal sabitin altında sadece bir nesne var None. Bir şey olsa bile, NoneTypeçünkü bir uygulama ayrıntıdır Nonetekil olması gerekir bazı tür. (Bu türden örnekler oluşturamamanız, bir örneğinin tekil olması amaçlandığının iyi bir göstergesidir.)
user4815162342

Bence kilit nokta Python'un güçlü bir nesne kimliği kavramına sahip olmasıdır. Bir nesne karşılaştırır olup olmadığını kontrol etmek isterseniz eşit To Nonetüm araçlar kullanmak suretiyle obj == None. Eğer bir nesne olup olmadığını kontrol etmek istiyorsanız olduğunu None , kullanmak obj is None. PEP 8 tavsiyesinin (ve bu cevabın) amacı, çoğu insanın Hiçbiri'ni kontrol etmek istediklerinde ikincisini istemesi ve aynı zamanda daha hızlı ve daha net olmasıdır.
user4815162342

Noneaynı zamanda önbelleğe alınan nesnelerden 0ve önbelleğe almanın gerçekte bir uygulama ayrıntısı olduğu diğer küçük tamsayılardan farklıdır . Buradaki fark, bir tamsayının özelliklerini veren içsel değere sahip olması ve hesaplanabilmesidir. Öte yandan, Nonehiçbir devleti yoktur, sadece kimliğini önemli kılan ve özel kılan şeydir.
user4815162342

11

PEP 8, istektonları karşılaştırırken operatörün kullanılmasının daha iyi olduğunu tanımlar .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.