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.



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.


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

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"

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.