Editor saya memperingatkan saya ketika saya membandingkan my_var == None
, tetapi tidak ada peringatan saat saya gunakan my_var is None
.
Saya melakukan tes di shell Python dan menentukan keduanya sintaks yang valid, tetapi editor saya tampaknya mengatakan itu my_var is None
lebih disukai.
Apakah ini masalahnya, dan jika demikian, mengapa?
python
comparison
nonetype
Clay Wardell
sumber
sumber
is
- python.org/dev/peps/pep-0008/#programming-recommendationsJawaban:
Ringkasan:
Gunakan
is
ketika Anda ingin memeriksa identitas suatu objek (misalnya memeriksa untuk melihat apakahvar
adaNone
). Gunakan==
saat Anda ingin memeriksa kesetaraan (mis. Apakahvar
sama dengan3
?).Penjelasan:
Anda dapat memiliki kelas khusus di mana
my_var == None
akan kembaliTrue
misalnya:
is
memeriksa identitas objek . Hanya ada 1 objekNone
, jadi ketika Anda melakukannyamy_var is None
, Anda memeriksa apakah mereka sebenarnya adalah objek yang sama (bukan hanya setara objek yang )Dengan kata lain,
==
adalah pemeriksaan untuk kesetaraan (yang didefinisikan dari objek ke objek) sedangkanis
pemeriksaan untuk identitas objek:sumber
is None
berbeda dari== None
?__eq__
dapat didefinisikan dengan cara apa pun, tetapi perilakuis
tidak dapat diubah dengan mudah.is
". Setelah mengomentari daftar itu, ia mengubahnya menjadi, "... bahkanis
(tetapi hanya jika Anda gila)."object == None
sebenarnya adalah ungkapan yang benar (meskipun saya tidak bisa memikirkan apapun di atas kepala saya). Anda hanya perlu tahu apa yang Anda lakukan.is
umumnya lebih disukai ketika membandingkan objek sewenang-wenang dengan lajang sepertiNone
karena lebih cepat dan lebih dapat diprediksi.is
selalu dibandingkan dengan identitas objek, sedangkan apa==
akan dilakukan tergantung pada jenis operan yang tepat dan bahkan pada pemesanan mereka.Rekomendasi ini didukung oleh PEP 8 , yang secara eksplisit menyatakan bahwa "perbandingan dengan lajang seperti Tidak ada harus selalu dilakukan dengan
is
atauis not
, jangan pernah operator kesetaraan."sumber
None
objek di bawah konstanta globalNone
. Jika ada,NoneType
ini adalah detail implementasi karenaNone
singleton harus memiliki beberapa tipe. (Fakta bahwa Anda tidak dapat membuat instance dari jenis ini adalah indikasi yang baik bahwa instansNone
, tentu saja gunakanlahobj == None
. Jika Anda ingin memeriksa apakah suatu objek adalahNone
, gunakanobj is None
. Inti dari rekomendasi PEP 8 (dan jawaban ini) adalah bahwa kebanyakan orang menginginkan yang terakhir ketika mereka ingin memeriksa Tidak Ada, dan itu juga terjadi lebih cepat dan lebih jelas.None
juga berbeda dari objek yang di-cache seperti0
dan bilangan bulat kecil lainnya, di mana caching benar-benar merupakan detail implementasi. Perbedaannya ada bahwa bilangan bulat memiliki nilai intrinsik yang memberikan sifat-sifatnya dan dapat dihitung. Di sisi lain,None
tidak memiliki status apa pun, hanya identitasnya yang penting dan membuatnya istimewa.PEP 8 mendefinisikan bahwa lebih baik menggunakan
is
operator ketika membandingkan lajang.sumber