Apakah ada perbedaan antara:
if foo is None: pass
dan
if foo == None: pass
Konvensi yang saya lihat di sebagian besar kode Python (dan kode yang saya tulis sendiri) adalah yang pertama, tetapi saya baru-baru menemukan kode yang menggunakan yang terakhir. Tidak ada yang merupakan instance (dan satu-satunya instance, IIRC) dari NoneType, jadi itu tidak masalah, kan? Apakah ada keadaan yang memungkinkan?
is
operator tidak dapat dikustomisasi (kelebihan beban oleh kelas yang ditentukan pengguna).__eq__(self)
ini adalah metode bawaan khusus yang menentukan bagaimana==
ditangani ketika digunakan pada objek Python. Di sini kita telah menimpanya sehingga ketika==
digunakan pada objek bertipeFoo
itu selalu mengembalikan true. Tidak ada metode yang setara untukis
operator sehingga perilakuis
tidak dapat diubah dengan cara yang sama.Anda mungkin ingin membaca identitas objek dan kesetaraan ini .
Pernyataan 'is' digunakan untuk identitas objek, memeriksa apakah objek merujuk ke instance yang sama (alamat yang sama dalam memori).
Dan pernyataan '==' mengacu pada persamaan (nilai yang sama).
sumber
a=1;b=1;print(a is b) # True
. Adakah yang tahu mengapa itua is b
ternyata benar bahkan jika mereka tampak sebagai 2 objek yang berbeda (alamat berbeda dalam memori)?Sebuah kata peringatan:
Apakah tidak persis sama dengan:
Yang pertama adalah tes nilai boolean dan dapat mengevaluasi false dalam konteks yang berbeda. Ada sejumlah hal yang mewakili false dalam tes nilai boolean misalnya wadah kosong, nilai boolean. Tidak ada yang juga menilai false dalam situasi ini tetapi hal-hal lain juga berlaku.
sumber
(ob1 is ob2)
sama dengan(id(ob1) == id(ob2))
sumber
is
versi membutuhkan tidak ada panggilan fungsi, dan tidak ada python-interpreter atribut lookup sama sekali; penerjemah dapat langsung menjawab jika ob1 sebenarnya adalah ob2.{} is {}
itu salah danid({}) == id({})
bisa (dan ada di CPython) benar. Lihat stackoverflow.com/questions/3877230Alasannya
foo is None
adalah cara yang disukai adalah bahwa Anda mungkin menangani objek yang mendefinisikan sendiri__eq__
, dan yang mendefinisikan objek sama dengan Tidak ada. Jadi, selalu gunakanfoo is None
jika Anda perlu melihat apakah itu benarNone
.sumber
Tidak ada perbedaan karena benda yang identik tentu akan sama. Namun, PEP 8 dengan jelas menyatakan bahwa Anda harus menggunakan
is
:sumber
is
tes untuk identitas, bukan kesetaraan. Untuk pernyataan Andafoo is none
, Python hanya membandingkan alamat memori objek. Itu berarti Anda mengajukan pertanyaan, "Apakah saya memiliki dua nama untuk objek yang sama?"==
di sisi lain menguji kesetaraan yang ditentukan oleh__eq__()
metode. Itu tidak peduli tentang identitas.None
adalah operator tunggal. JadiNone is None
selalu benar.sumber
Untuk Tidak Ada seharusnya tidak ada perbedaan antara kesetaraan (==) dan identitas. The NoneType mungkin mengembalikan identitas untuk kesetaraan. Karena None adalah satu-satunya contoh yang dapat Anda buat dari NoneType (saya pikir ini benar), kedua operasi itu sama. Dalam kasus jenis lain ini tidak selalu terjadi. Sebagai contoh:
Ini akan mencetak "Sama" karena daftar memiliki operasi perbandingan yang bukan pengembalian identitas secara default.
sumber
@ Jason :
Saya tidak suka menggunakan "jika foo:" kecuali foo benar-benar mewakili nilai boolean (yaitu 0 atau 1). Jika foo adalah string atau objek atau sesuatu yang lain, "if foo:" mungkin berfungsi, tetapi sepertinya jalan pintas malas bagi saya. Jika Anda memeriksa untuk melihat apakah x adalah Tidak ada, katakan "jika x adalah Tidak ada:".
sumber
if foo
akan kembali salah dan komentar#foo is None
salah.Beberapa detail lebih lanjut:
The
is
klausul sebenarnya memeriksa apakah duaobject
s berada pada lokasi memori yang sama atau tidak. yaitu apakah mereka berdua menunjuk ke lokasi memori yang sama dan memiliki yang samaid
.Sebagai konsekuensi dari 1,
is
memastikan apakah, atau tidak, dua yang diwakili secara leksikalobject
memiliki atribut yang identik (atribut-atribut ...) atau tidakInstansiasi dari tipe primitif seperti
bool
,int
,string
(dengan beberapa pengecualian),NoneType
memiliki nilai yang sama akan selalu berada di lokasi memori yang sama.Misalnya
Dan karena
NoneType
hanya dapat memiliki satu contoh dari dirinya sendiri dalam tabel "look-up" python karena itu yang pertama dan yang terakhir lebih dari gaya pemrograman pengembang yang menulis kode (mungkin untuk konsistensi) daripada memiliki alasan logis yang halus untuk pilih satu dari yang lain.sumber
some_string is "bar"
untuk membandingkan string PERNAH. Tidak ada alasan tunggal yang dapat diterima untuk melakukannya dan itu akan pecah ketika Anda tidak mengharapkannya. Fakta bahwa itu sering berhasil adalah hanya karena CPython tahu itu akan bodoh untuk membuat dua objek abadi yang memiliki konten yang sama. Tapi itu bisa terjadi.int
, kan?Kesimpulan John Machin yang
None
merupakan singleton adalah kesimpulan yang didukung oleh kode ini.Karena
None
singleton,x == None
danx is None
akan memiliki hasil yang sama. Namun, menurut pendapat estetika saya,x == None
itu yang terbaik.sumber
None
. Sebagai perbandingan, seseorang jarang melihat Tidak ada yang digunakan dalam konteks lain apa pun kecuali untuk menjadi serupaFalse
dengan nilai-nilai lain yang benar. Dalam kasus-kasus seperti itu, lebih idiomatis untuk melakukan sesuatu sepertiif x: pass
sumber