Apa perbedaan antara “adalah Tidak Ada” dan “== Tidak Ada”

324

Saya baru-baru ini menemukan sintaks ini, saya tidak mengetahui perbedaannya.

Saya akan sangat menghargai jika seseorang dapat memberi tahu saya perbedaannya.

myusuf3
sumber
1
Apakah ini menjawab pertanyaan Anda? Apakah ada perbedaan antara "==" dan "is"?
Jun
Tidak jelas apakah pertanyaan ini tentang isvs ==, atau tentang sifat dari apa sebenarnya Nonedan bagaimana perilaku berbeda dalam kedua konteks (yang terakhir adalah mengapa saya berakhir di sini). Berdasarkan ketidakjelasan dan kurangnya tanggapan OP ... Saya terkejut ini memiliki begitu banyak upvotes. Maksud saya ... cmon ... pertanyaannya bahkan tidak ditulis dalam pertanyaan yang sebenarnya ...
RTbecard

Jawaban:

291

Jawabannya dijelaskan di sini .

Kutipan:

Kelas bebas menerapkan perbandingan dengan cara apa pun yang dipilihnya, dan dapat memilih untuk membuat perbandingan terhadap Tidak ada yang berarti (yang benar-benar masuk akal; jika seseorang mengatakan kepada Anda untuk mengimplementasikan objek Tidak Ada dari awal, bagaimana lagi Anda mendapatkannya untuk membandingkan True melawan dirinya sendiri?).

Secara praktis, tidak ada banyak perbedaan karena operator pembanding khusus jarang. Tetapi Anda harus menggunakan is Nonesebagai aturan umum.

Ben Hoffstein
sumber
57
Juga, is Nonesedikit (~ 50%) lebih cepat daripada == None:)
Nas Banov
26
@ myusuf3: >>> timeit.Timer ('None is None'). timeit () | 0,225 | >>> timeit.Timer ('None == None'). timeit () | 0,328
Nas Banov
9
@ myusuf3 Anda tidak benar-benar membutuhkan bukti untuk itu. ispada dasarnya adalah perbandingan integer sementara ==tidak hanya menyelesaikan referensi tetapi membandingkan nilai yang mungkin memiliki tipe yang tidak cocok.
Pijusn
4
Satu yang mendukung "adalah". Ketika suatu variabel bisa berupa Tidak Ada atau sesuatu yang tidak memiliki perbandingan bermakna dengan Tidak ada. Sebagai contoh, sebuah variabel dapat berupa numpy.array atau None (case khusus saya).
Jblasco
3
Saya ingin menambahkan apa yang dikatakan @TimLudwinski: pertama, jika seseorang memilih untuk mengesampingkan operator kesetaraan untuk menjadikan None sebagai kasus khusus, mengapa kami ingin memberi tahu mereka sebaliknya? Kedua, "Seharusnya ada satu - dan lebih disukai hanya satu - cara yang jelas untuk melakukannya." Dan cara yang jelas untuk memeriksa apakah sesuatu sama dengan sesuatu adalah, yah, operator kesetaraan.
Yuval
162
class Foo:
    def __eq__(self,other):
        return True
foo=Foo()

print(foo==None)
# True

print(foo is None)
# False
unutbu
sumber
56

Dalam hal ini, mereka sama. Noneadalah objek tunggal (hanya ada satu None).

is memeriksa untuk melihat apakah objek tersebut adalah objek yang sama, sementara == hanya memeriksa apakah mereka setara.

Sebagai contoh:

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

Tetapi karena hanya ada satu None, mereka akan selalu sama, dan isakan mengembalikan Benar.

p = None
q = None
p is q # True because they are both pointing to the same "None"
Donald Miner
sumber
17
Jawaban ini tidak benar, seperti yang dijelaskan dalam jawaban Ben Hoffstein di bawah ini stackoverflow.com/questions/3257919/is-none-vs-none/… . x == Nonedapat mengevaluasi Truebahkan jika xtidak Nonetetapi sebuah instance dari beberapa kelas dengan operator kesetaraan kustom sendiri.
maks
5

Jika Anda menggunakan numpy,

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

akan memberi Anda kesalahan ketika numpy melakukan perbandingan elemen

jf328
sumber
3

Itu tergantung pada apa yang Anda bandingkan dengan Tidak ada. Beberapa kelas memiliki metode perbandingan khusus yang memperlakukan == Noneberbeda is None.

Khususnya keluaran a == None bahkan tidak harus boolean !! - Penyebab bug yang sering terjadi.

Untuk contoh spesifik, ambil array numpy tempat ==perbandingan diterapkan elementwise:

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
PGlivi
sumber