“İs None” ve “== None” arasındaki fark nedir


324

Geçenlerde bu sözdizimiyle karşılaştım, farkın farkında değilim.

Birisi bana farkı söylese çok sevinirim.



1
Bu sorunuza cevap veriyor mu? "==" ve "is" arasında bir fark var mı?
Haziran

Bu sorunun isvs ile mi ==, yoksa tam olarak ne Noneolduğunun ve davranışın her iki bağlamda nasıl farklı olduğu hakkında belirsizdir (ikincisi buraya gelmem nedenidir). OP yanıtlarının belirsizliğine ve eksikliğine dayanarak ... Bunun çok fazla oyu olduğuna şaşırdım. Yani ...
hadi

Yanıtlar:


291

Cevap burada açıklanmaktadır .

Alıntılamak:

Bir sınıf karşılaştırmayı istediği şekilde uygulamakta özgürdür ve Hiçbiri ile karşılaştırma yapmayı seçebilir Bir şey ifade eder (aslında mantıklıdır; Birisi size None nesnesini sıfırdan uygulamanızı söylerse, True'yu karşılaştırmak için başka nasıl elde edersiniz? kendisine karşı?).

Pratik olarak konuşursak, özel karşılaştırma operatörleri nadir olduğu için fazla bir fark yoktur. Ancak is Nonegenel bir kural olarak kullanmalısınız .


57
Ayrıca, is Nonebiraz daha (~% 50) == None:)
Nas Banov

26
@ myusuf3: >>> timeit.Timer ('Hiçbiri Yok'). timeit () | 0.225 | >>> timeit.Timer ('Yok == Yok'). timeit () | 0.328
Nas Banov

9
@ myusuf3 Bunun için gerçekten bir kanıt gerekmez. istemel olarak, tamsayı karşılaştırma ise ==sadece referansları çözmekle kalmaz, aynı zamanda uyumsuz tiplere sahip olabilecek değerleri de karşılaştırır.
Pijusn

4
"Olmak" lehine biri. Bir değişken Hiçbiri veya Hiçbiri ile anlamlı bir karşılaştırması olmayan bir şey olduğunda. Örneğin, bir değişken bir numpy.array veya None (benim özel durumum) olabilir.
Jblasco

3
@TimLudwinski'nin söylediklerine eklemek istiyorum: ilk olarak, birisi Eşitlik operatörünü Yok'u özel bir durum haline getirmek için geçersiz kılmayı seçerse, neden onlara başka türlü söylemek isteriz? İkincisi, "Bir - ve tercihen sadece bir - bunu yapmanın açık bir yolu olmalı." Ve bir şeyin bir şeye eşit olup olmadığını kontrol etmenin bariz yolu eşitlik operatörüdür.
Yuval

162
class Foo:
    def __eq__(self,other):
        return True
foo=Foo()

print(foo==None)
# True

print(foo is None)
# False

56

Bu durumda, aynılar. Nonetek bir nesnedir (sadece bir tane vardır None).

is nesnenin aynı nesne olup olmadığını kontrol ederken == sadece eşdeğer olup olmadığını kontrol eder.

Örneğin:

p = [1]
q = [1]
p is q # False because they are not the same actual object
p == q # True because they are equivalent

Ancak sadece bir tane Noneolduğundan, her zaman aynı isolacaklar ve True'ya dönecekler.

p = None
q = None
p is q # True because they are both pointing to the same "None"

17
Ben Hoffstein'ın aşağıdaki cevabında açıklandığı gibi bu cevap doğru değil stackoverflow.com/questions/3257919/is-none-vs-none/… . kendi özel eşitlik operatörüne sahip bir sınıfın örneği olmasa bile x == Nonedeğerlendirebilir . TruexNone
maksimum

5

Numpy kullanırsanız,

if np.zeros(3)==None: pass

numpy elementwise karşılaştırma yaptığında size hata verecektir


3

Hiçbiri ile karşılaştırdığınıza bağlıdır. Bazı sınıflar, == Nonebirbirinden farklı davranan özel karşılaştırma yöntemlerine sahiptir is None.

Özellikle çıktısının a == None boolean olması bile gerekmez !! - sık görülen bir hata nedeni.

Belirli bir örnek için ==karşılaştırmanın öğe şeklinde uygulandığı bir numpy dizisi alın:

import numpy as np
a = np.zeros(3) # now a is array([0., 0., 0.])
a == None #compares elementwise, outputs array([False, False, False]), i.e. not boolean!!!
a is None #compares object to object, outputs False
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.