Perbandingan Python None: haruskah saya menggunakan "is" atau ==?

213

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 Nonelebih disukai.

Apakah ini masalahnya, dan jika demikian, mengapa?

Clay Wardell
sumber
7
PEP 8 mengatakan di suatu tempat bahwa Anda harus membandingkan dengan lajang menggunakan is- python.org/dev/peps/pep-0008/#programming-recommendations
Volatility
2
Poster itu berbicara tentang Python 3, dan pertanyaan saya adalah tentang Python 2.x. Saya tidak yakin apakah ini perbedaan yang cukup besar untuk menjamin keduanya tetap ada tetapi saya mengedit pertanyaan untuk memasukkannya untuk berjaga-jaga.
Clay Wardell
2
Saya rasa pertanyaan ini bukan duplikat. Yang lainnya adalah tentang == vs secara umum, yang satu ini tentang Tidak ada pada khususnya.
IJ Kennedy

Jawaban:

254

Ringkasan:

Gunakan isketika Anda ingin memeriksa identitas suatu objek (misalnya memeriksa untuk melihat apakah varada None). Gunakan ==saat Anda ingin memeriksa kesetaraan (mis. Apakah varsama dengan3 ?).

Penjelasan:

Anda dapat memiliki kelas khusus di mana my_var == None akan kembaliTrue

misalnya:

class Negator(object):
    def __eq__(self,other):
        return not other

thing = Negator()
print thing == None    #True
print thing is None    #False

ismemeriksa identitas objek . Hanya ada 1 objek None, jadi ketika Anda melakukannya my_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) sedangkan ispemeriksaan untuk identitas objek:

lst = [1,2,3]
lst == lst[:]  # This is True since the lists are "equivalent"
lst is lst[:]  # This is False since they're actually different objects
mgilson
sumber
22
Kapan is Noneberbeda dari == None?
Blender
11
@Blender Dalam kasus yang disebutkan. __eq__dapat didefinisikan dengan cara apa pun, tetapi perilaku istidak dapat diubah dengan mudah.
Lev Levitsky
5
@LevLevitsky: Salah satu contoh penggunaan Mython adalah "memperluas protokol sehingga setiap operator dapat kelebihan beban, bahkan is". Setelah mengomentari daftar itu, ia mengubahnya menjadi, "... bahkan is(tetapi hanya jika Anda gila)."
abarnert
1
+1, tetapi akan lebih baik lagi jika jawaban ini menyertakan referensi PEP 8 yang dilakukan orang lain (serta menjelaskan mengapa keputusan di balik PEP 8 masuk akal, yang sudah dilakukan).
abarnert
3
@abarnert - Saya bahkan tidak tahu bahwa PEP 8 membuat rekomendasi di sini. Intinya adalah mereka adalah operator yang berbeda yang melakukan hal yang berbeda. Mungkin ada kasus-kasus di mana object == Nonesebenarnya adalah ungkapan yang benar (meskipun saya tidak bisa memikirkan apapun di atas kepala saya). Anda hanya perlu tahu apa yang Anda lakukan.
mgilson
127

isumumnya lebih disukai ketika membandingkan objek sewenang-wenang dengan lajang seperti Nonekarena lebih cepat dan lebih dapat diprediksi. isselalu 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 isatau is not, jangan pernah operator kesetaraan."

pengguna4815162342
sumber
6
Terima kasih telah memposting ini; jawaban yang diterima membuat beberapa poin menarik, tetapi jawaban Anda lebih langsung menjawab pertanyaan itu.
Luke Davis
Tampaknya aneh untuk mengandalkan apa yang pada dasarnya merupakan detail implementasi. Mengapa saya harus peduli berapa banyak contoh NoneType yang ada?
BallpointBen
@ BallpointBen Karena ini bukan detail implementasi - hanya ada satu Noneobjek di bawah konstanta global None. Jika ada, NoneTypeini adalah detail implementasi karena Nonesingleton harus memiliki beberapa tipe. (Fakta bahwa Anda tidak dapat membuat instance dari jenis ini adalah indikasi yang baik bahwa instans
satuannya
@BallpointBen Saya pikir poin utamanya adalah bahwa Python memiliki konsep identitas objek yang kuat. Jika Anda ingin memeriksa apakah suatu objek sebanding dengan None, tentu saja gunakanlah obj == None. Jika Anda ingin memeriksa apakah suatu objek adalah None , gunakan obj 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.
user4815162342
Nonejuga berbeda dari objek yang di-cache seperti 0dan 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, Nonetidak memiliki status apa pun, hanya identitasnya yang penting dan membuatnya istimewa.
user4815162342
11

PEP 8 mendefinisikan bahwa lebih baik menggunakan isoperator ketika membandingkan lajang.

Thorsten Kranz
sumber