Bagaimana cara merujuk ke objek nol di Python?
1193
Dalam Python, objek 'null' adalah singleton None
.
Cara terbaik untuk memeriksa hal-hal untuk "Noneness" adalah dengan menggunakan operator identitas, is
:
if foo is None:
...
egg is None
lebihegg == None
: Yang terakhir dapat kelebihan beban, dan cenderung rusak ketika membandingkan objek yang valid dengan Tidak Ada (tergantung pada bagaimana itu diterapkan, tetapi Anda tidak mengharapkan semua orang untuk mengambil perbandingan dengan Tidak Ada ke dalam akun, bukan?) , sementarais
selalu bekerja sama.None
, Python nol?Tidak ada
null
dalam Python, melainkan adaNone
. Seperti yang telah dinyatakan, cara paling akurat untuk menguji bahwa sesuatu telah diberiNone
nilai adalah dengan menggunakanis
operator identitas, yang menguji dua variabel yang merujuk ke objek yang sama.Dasar
Ada dan hanya bisa satu
None
None
adalah satu-satunya instance dari kelasNoneType
dan setiap upaya lebih lanjut dalam membuat instance kelas yang akan mengembalikan objek yang sama, yang membuatNone
singleton. Pendatang baru di Python sering melihat pesan kesalahan yang menyebutkanNoneType
dan bertanya-tanya apa itu. Ini adalah pendapat pribadi saya bahwa pesan-pesan ini hanya bisa disebutkanNone
namanya saja, karena, seperti yang akan kita lihat sebentar lagi,None
menyisakan sedikit ruang bagi ambiguitas. Jadi, jika Anda melihat beberapaTypeError
pesan yang menyebutkan bahwaNoneType
tidak dapat melakukan ini atau tidak dapat melakukannya, ketahuilah bahwa itu hanyalah pesanNone
yang digunakan dengan cara yang tidak dapat dilakukan.Juga,
None
adalah konstanta bawaan, segera setelah Anda memulai Python tersedia untuk digunakan dari mana saja, baik dalam modul, kelas, atau fungsi.NoneType
sebaliknya tidak, Anda harus mendapatkan referensi terlebih dahulu dengan menanyakanNone
kelasnya.Anda dapat memeriksa
None
keunikan dengan fungsi identitas Pythonid()
. Ini mengembalikan nomor unik yang ditetapkan untuk suatu objek, masing-masing objek memiliki satu. Jika id dari dua variabel sama, maka mereka menunjuk ke objek yang sama.None
tidak dapat ditimpaDalam versi Python yang jauh lebih lama (sebelum 2.4) dimungkinkan untuk ditugaskan kembali
None
, tetapi tidak lagi. Bahkan sebagai atribut kelas atau dalam batas fungsi.Karenanya aman untuk mengasumsikan bahwa semua
None
referensi adalah sama. Tidak ada "kebiasaan"None
.Untuk menguji
None
gunakanis
operatorSaat menulis kode, Anda mungkin tergoda untuk menguji Noneness seperti ini:
Atau untuk menguji kepalsuan seperti ini
Anda perlu memahami implikasinya dan mengapa itu sering merupakan ide yang baik untuk menjadi eksplisit.
Kasus 1: menguji apakah nilainya
None
kenapa melakukan ini
daripada
Yang pertama setara dengan:
Padahal ungkapan
value==None
itu sebenarnya diterapkan seperti inijika nilainya benar
None
maka Anda akan mendapatkan apa yang Anda harapkan.Dalam kebanyakan kasus, hasilnya akan sama, tetapi
__eq__()
metode ini membuka pintu yang membatalkan jaminan keakuratan, karena dapat ditimpa dalam kelas untuk memberikan perilaku khusus.Pertimbangkan kelas ini.
Jadi Anda mencobanya
None
dan berhasilTapi kemudian itu juga berfungsi pada string kosong
Dan lagi
Kasus 2: Menggunakan
None
sebagai booleanDua tes berikut
sebenarnya dievaluasi sebagai
None
adalah "falsey", yang berarti bahwa jika dilemparkan ke boolean ia akan kembaliFalse
dan jika diterapkannot
operator itu akan kembaliTrue
. Namun perlu dicatat bahwa ini bukan properti unik untukNone
. Selain ituFalse
sendiri, properti dibagi oleh daftar kosong, tupel, set, dikte, string, serta 0, dan semua objek dari kelas yang menerapkan__bool__()
metode ajaib untuk kembaliFalse
.Jadi saat menguji variabel dengan cara berikut, waspadalah dengan apa yang Anda sertakan atau tidak termasuk dalam tes:
Di atas, apakah Anda bermaksud menelepon
init_value()
saat nilai diatur secara khususNone
, atau apakah Anda maksud bahwa nilai ditetapkan0
, atau string kosong, atau daftar kosong juga harus memicu inisialisasi. Seperti yang saya katakan, berhati-hatilah. Seperti yang sering terjadi dalam Python eksplisit lebih baik daripada implisit .None
dalam praktekNone
digunakan sebagai nilai sinyalNone
memiliki status khusus dalam Python. Ini adalah nilai dasar favorit karena banyak algoritma memperlakukannya sebagai nilai luar biasa. Dalam skenario seperti itu dapat digunakan sebagai tanda untuk memberi sinyal bahwa suatu kondisi memerlukan penanganan khusus (seperti pengaturan nilai default).Anda dapat menetapkan
None
argumen kata kunci dari suatu fungsi dan kemudian secara eksplisit mengujinya.Anda dapat mengembalikannya sebagai default ketika mencoba untuk mendapatkan atribut objek dan kemudian secara eksplisit mengujinya sebelum melakukan sesuatu yang istimewa.
Secara default metode kamus
get()
kembaliNone
ketika mencoba mengakses kunci yang tidak ada:Jika Anda mencoba mengaksesnya dengan menggunakan notasi subskrip, maka
KeyError
akan dimunculkanDemikian juga jika Anda mencoba memunculkan item yang tidak ada
yang dapat Anda tekan dengan nilai default yang biasanya diatur ke
None
None
digunakan sebagai bendera dan nilai yang validPenggunaan yang dijelaskan di atas
None
berlaku ketika tidak dianggap sebagai nilai yang valid, tetapi lebih seperti sinyal untuk melakukan sesuatu yang istimewa. Namun ada situasi di mana kadang-kadang penting untuk mengetahui dari manaNone
asalnya karena meskipun itu digunakan sebagai sinyal itu juga bisa menjadi bagian dari data.Saat Anda meminta objek untuk atributnya dengan
getattr(some_obj, 'attribute_name', None)
membalasNone
tidak memberi tahu Anda apakah atribut yang Anda coba akses diset keNone
atau jika itu sama sekali tidak ada dari objek. Situasi yang sama ketika mengakses kunci dari kamus sepertisome_dict.get('some_key')
, Anda tidak tahu apakahsome_dict['some_key']
ada yang hilang atau hanya diatur keNone
. Jika Anda memerlukan informasi itu, cara biasa untuk menangani ini adalah dengan langsung mencoba mengakses atribut atau kunci dari dalam sebuahtry/except
konstruksi:Demikian pula dengan dikt:
Dua contoh di atas menunjukkan bagaimana menangani kasus objek dan kamus, bagaimana dengan fungsi? Hal yang sama, tetapi kami menggunakan argumen kata kunci tanda bintang ganda untuk tujuan itu:
None
hanya digunakan sebagai nilai yang validJika Anda menemukan bahwa kode Anda dikotori dengan
try/except
pola di atas hanya untuk membedakan antaraNone
flag danNone
data, maka gunakan saja nilai tes lain. Ada pola di mana nilai yang berada di luar rangkaian nilai yang valid dimasukkan sebagai bagian dari data dalam struktur data dan digunakan untuk mengontrol dan menguji kondisi khusus (misalnya batas, keadaan, dll). Nilai seperti ini disebut sentinel dan dapat digunakan dengan caraNone
yang digunakan sebagai sinyal. Ini sepele untuk membuat sentinel dengan Python.The
undefined
objek di atas adalah unik dan tidak melakukan apa-apa yang mungkin menarik untuk sebuah program, itu sehingga pengganti yang sangat baik untukNone
sebagai bendera. Beberapa peringatan berlaku, lebih lanjut tentang hal itu setelah kode.Dengan fungsi
Dengan dikt
Dengan sebuah benda
Seperti yang saya sebutkan sebelumnya penjaga adat datang dengan beberapa peringatan. Pertama, itu bukan kata kunci
None
, jadi python tidak melindunginya. Anda dapat menimpaundefined
di atas kapan saja, di mana saja dalam modul yang ditentukan, jadi berhati-hatilah bagaimana Anda mengekspos dan menggunakannya. Selanjutnya, instance yang dikembalikan olehobject()
bukan singleton, jika Anda melakukan panggilan itu 10 kali Anda mendapatkan 10 objek yang berbeda. Akhirnya, penggunaan sentinel sangat istimewa. Sentinel khusus untuk perpustakaan yang digunakan dan karenanya cakupannya umumnya harus dibatasi untuk internal perpustakaan. Seharusnya tidak "bocor" keluar. Kode eksternal seharusnya hanya menyadarinya, jika tujuannya adalah untuk memperluas atau menambah API perpustakaan.sumber
Ini tidak disebut null seperti dalam bahasa lain, tetapi
None
. Selalu ada hanya satu instance dari objek ini, sehingga Anda dapat memeriksa kesetaraan denganx is None
(perbandingan identitas), bukanx == None
, jika Anda mau.sumber
None
. Maka semua orang pintar yang dibandingkan denganNoneType
akan menang!Dalam Python, untuk mewakili tidak adanya nilai, Anda dapat menggunakan nilai None ( types.NoneType.None ) untuk objek dan "" (atau len () == 0 ) untuk string. Karena itu:
Mengenai perbedaan antara "==" dan "adalah", pengujian untuk identitas objek menggunakan "==" harus memadai. Namun, karena operasi "adalah" didefinisikan sebagai operasi identitas objek, mungkin lebih tepat untuk menggunakannya, daripada "==". Tidak yakin apakah ada perbedaan kecepatan.
Bagaimanapun, Anda dapat melihat:
sumber
0 == false
kembalitrue
adalah karena operator double-equals mengetikkan paksaan. Namun, dengan operator triple-equals,0 === false
pengembalianfalse
, karena 'angka' dan 'boolean' adalah tipe yang berbeda.true
dalam kondisi. Di Rust and Go,0
danfalse
ada berbagai jenis yang tidak dapat dibandingkan untuk kesetaraan.Null adalah jenis objek khusus seperti:
Anda dapat memeriksa apakah suatu objek ada di kelas 'NoneType':
Informasi lebih lanjut tersedia di Python Docs
sumber
Pengujian nilai Per Truth , 'None' langsung menguji sebagai FALSE, jadi ungkapan paling sederhana akan cukup:
sumber
True
untuk setiap nilai falsy, bukan hanyaNone
.