Dalam komentar pada pertanyaan ini , saya melihat pernyataan yang merekomendasikan penggunaan
result is not None
vs.
result != None
Saya bertanya-tanya apa perbedaannya, dan mengapa yang satu lebih direkomendasikan daripada yang lain?
Dalam komentar pada pertanyaan ini , saya melihat pernyataan yang merekomendasikan penggunaan
result is not None
vs.
result != None
Saya bertanya-tanya apa perbedaannya, dan mengapa yang satu lebih direkomendasikan daripada yang lain?
Jawaban:
==
adalah ujian kesetaraan . Ia memeriksa apakah sisi kanan dan sisi kiri adalah benda yang sama (sesuai dengan__eq__
atau__cmp__
metode.)is
adalah tes identitas . Ia memeriksa apakah sisi kanan dan sisi kiri adalah objek yang sama. Tidak ada panggilan metode yang dilakukan, objek tidak dapat memengaruhiis
operasi.Anda menggunakan
is
(danis not
) untuk lajang, sepertiNone
, di mana Anda tidak peduli dengan objek yang mungkin ingin berpura-puraNone
atau di mana Anda ingin melindungi terhadap benda yang pecah ketika dibandingkan denganNone
.sumber
None
memiliki beberapa metode dan hampir tidak memiliki atribut. Jika__eq__
pengujian Anda mengharapkan suatu metode atau atribut, itu mungkin pecah.def __eq__( self, other ): return self.size == other.size
. Misalnya, akan pecah jikaother
kebetulanNone
.is
seperti Java==
. Python==
adalah seperti Jawa.equals()
. Tentu saja ini hanya membantu jika Anda tahu Java.is
seperti===
(sangat sama), dan sebaliknyais not
seperti!==
(tidak persis sama).is not
operator tunggal atau hanya meniadakan hasilis
seperti internalnot foo is bar
?Pertama, biarkan saya membahas beberapa istilah. Jika Anda hanya ingin pertanyaan Anda dijawab, gulir ke bawah ke "Menjawab pertanyaan Anda".
Definisi
Identitas objek : Saat Anda membuat objek, Anda dapat menetapkannya ke variabel. Anda kemudian dapat juga menugaskannya ke variabel lain. Dan satu lagi.
Dalam hal ini,
cancel
,close
, dandismiss
semua mengacu pada objek yang sama dalam memori. Anda hanya membuat satuButton
objek, dan ketiga variabel merujuk ke objek yang satu ini. Kami mengatakan bahwacancel
,,close
dandismiss
semua mengacu pada objek yang identik ; yaitu, mereka merujuk ke satu objek tunggal.Kesetaraan objek : Ketika Anda membandingkan dua objek, Anda biasanya tidak peduli bahwa itu merujuk ke objek yang sama persis di memori. Dengan persamaan objek, Anda dapat menentukan aturan Anda sendiri untuk membandingkan dua objek. Ketika Anda menulis
if a == b:
, Anda pada dasarnya mengatakanif a.__eq__(b):
. Ini memungkinkan Anda menentukan__eq__
metodea
agar Anda dapat menggunakan logika perbandingan sendiri.Dasar pemikiran untuk perbandingan kesetaraan
Dasar Pemikiran: Dua objek memiliki data yang sama persis, tetapi tidak identik. (Mereka bukan objek yang sama dalam memori.) Contoh: String
Catatan: Saya menggunakan string unicode di sini karena Python cukup pintar untuk menggunakan kembali string biasa tanpa membuat yang baru di memori.
Di sini, saya memiliki dua string unicode,
a
danb
. Mereka memiliki konten yang sama persis, tetapi mereka bukan objek yang sama dalam memori. Namun, ketika kami membandingkannya, kami ingin mereka membandingkan yang sama. Apa yang terjadi di sini adalah bahwa objek unicode telah mengimplementasikan__eq__
metode ini.Catatan:
__eq__
aktifunicode
pasti diterapkan lebih efisien daripada ini.Dasar Pemikiran: Dua objek memiliki data yang berbeda, tetapi dianggap objek yang sama jika beberapa data utama adalah sama. Contoh: Sebagian besar tipe data model
Di sini, saya punya dua monitor Dell,
a
danb
. Mereka memiliki merek dan model yang sama. Namun, mereka tidak memiliki data yang sama atau objek yang sama dalam memori. Namun, ketika kami membandingkannya, kami ingin mereka membandingkan yang sama. Apa yang terjadi di sini adalah objek Monitor mengimplementasikan__eq__
metode.Menjawab pertanyaan Anda
Saat membandingkan
None
, selalu gunakanis not
. Tidak ada yang tunggal dalam Python - hanya ada satu contoh dalam memori.Dengan membandingkan identitas , ini dapat dilakukan dengan sangat cepat. Python memeriksa apakah objek yang Anda maksud memiliki alamat memori yang sama dengan objek global None - perbandingan dua angka yang sangat, sangat cepat.
Dengan membandingkan kesetaraan , Python harus mencari apakah objek Anda memiliki
__eq__
metode. Jika tidak, itu akan memeriksa setiap superclass mencari__eq__
metode. Jika menemukan satu, Python menyebutnya. Ini sangat buruk jika__eq__
metode ini lambat dan tidak segera kembali ketika melihat bahwa objek lainnyaNone
.Apakah Anda tidak menerapkannya
__eq__
? Kemudian Python mungkin akan menemukan__eq__
metodeobject
dan menggunakannya sebagai gantinya - yang hanya memeriksa identitas objek saja.Saat membandingkan sebagian besar hal lain dengan Python, Anda akan menggunakannya
!=
.sumber
Pertimbangkan yang berikut ini:
sumber
None
adalah singleton, oleh karena itu perbandingan identitas akan selalu berfungsi, sedangkan objek dapat memalsukan perbandingan kesetaraan melalui.__eq__()
.sumber
None
, tetapi perilaku yang salah tentang hal ituNone
dapat terjadi sebagai efek samping dari penerapan kesetaraan terhadap jenis lainnya. Ini bukan implikasi keamanan, tetapi implikasi kebenarannya.Beberapa objek adalah lajang, dan karenanya
is
sama dengan==
. Sebagian besar tidak.sumber
()
dan1
secara inheren bukan lajang.-NSMALLNEGINTS <= n <= NSMALLPOSINTS
) dan tuple kosong adalah lajang. Memang tidak didokumentasikan atau dijamin, tetapi tidak mungkin berubah.