Lebih
null objek di Python?
Bagaimana saya merujuk ke objek null dalam Python?
1086
5
Bagaimana saya merujuk ke objek null dalam Python?
Di Python, yang 'null' obyek singleton
None
.Cara terbaik untuk memeriksa hal-hal untuk "Noneness" adalah dengan menggunakan identitas operator,
adalah
:None
, Python's null?Ada's tidak ada
null
di Python, malah ada'sTidak ada
. Seperti yang dinyatakan sudah cara yang paling akurat untuk menguji bahwa sesuatu yang telah diberikanNone
sebagai nilai adalah dengan menggunakanadalah
identitas operator, yang menguji bahwa dua variabel yang mengacu pada objek yang sama.Dasar #
Ada dan hanya bisa menjadi salah satu
None
##None
adalah satu-satunya contoh dari kelasNoneType
dan setiap upaya lebih lanjut di instantiate kelas itu akan kembali objek yang sama, yang membuatNone
tunggal. Pendatang baru ke Python sering melihat pesan kesalahan yang menyebutkanNoneType
dan bertanya-tanya apa itu. It's pendapat pribadi saya bahwa pesan-pesan ini hanya bisa hanya menyebutkanTidak
dengan nama karena, seperti yang kita'll melihat sesaat,None
meninggalkan sedikit ruang untuk ambiguitas. Jadi, jika anda melihat beberapaTypeError
pesan yang menyebutkan bahwaNoneType
dapat't melakukan ini atau dapat't melakukan itu, hanya tahu bahwa itu's hanya satuTidak ada
yang digunakan dalam cara yang dapat't. Juga,None
adalah built-in konstan, segera setelah anda mulai Python itu's yang tersedia untuk digunakan dari mana saja, baik di dalam modul, kelas, atau fungsi.NoneType
dengan kontras tidak, anda'a perlu untuk mendapatkan referensi untuk itu pertama dengan queryTidak
untuk kelasnya.Anda dapat memeriksa
None
's keunikan dengan Python's identitas fungsiid()
. Ia mengembalikan nomor unik yang diberikan kepada suatu objek, masing-masing objek memiliki satu. Jika id dari dua variabel adalah sama, maka mereka menunjuk pada fakta untuk objek yang sama.Tidak ada
tidak akan ditimpaDalam banyak versi Python (sebelum 2.4) adalah mungkin untuk menetapkan kembali
Tidak
, tapi sekarang tidak lagi. Bahkan bukan sebagai atribut class atau dalam batas-batas fungsi.It's oleh karena itu aman untuk mengasumsikan bahwa semua
None
referensi yang sama. Ada's tidak ada "kustom"Tidak ada
.Untuk menguji untuk
Tidak
gunakanadalah
operatorSaat menulis kode anda mungkin tergoda untuk menguji Noneness seperti ini:
Atau untuk menguji kepalsuan seperti ini
Anda perlu memahami implikasi dan mengapa hal itu's sering ide yang baik untuk menjadi eksplisit.
Kasus 1: pengujian jika nilai
None
mengapa ini
daripada
Yang pertama adalah setara dengan:
Sedangkan ungkapan
value==None
ini sebenarnya diterapkan seperti inijika nilai benar-benar adalah
Tidak
maka anda'll mendapatkan apa yang anda harapkan.Dalam kebanyakan kasus umum hasilnya akan sama, tapi
__eq__()
metode terbuka sebuah pintu yang void jaminan akurasi, karena itu dapat diganti dalam kelas untuk memberikan perilaku khusus. Pertimbangkan kelas ini.Jadi anda mencobanya pada
None
dan bekerjaTapi kemudian ia juga bekerja pada string kosong
Namun
Kasus 2: Menggunakan
None
sebagai booleanBerikut dua tes
sebenarnya dievaluasi sebagai
None
adalah "falsey", yang berarti bahwa jika dilemparkan ke boolean itu akan kembaliPalsu
dan jika diterapkan dengantidak
operator ini akan mengembalikanTrue
. Namun, perlu diingat bahwa itu's tidak properti unik untukTidak ada
. SelainPalsu
itu sendiri, properti yang dimiliki oleh kosong list, tuple, set, dicts, string, serta 0, dan semua objek dari kelas yang menerapkan__bool__()
metode magic untuk kembaliPalsu
.Jadi, ketika pengujian untuk variabel dengan cara berikut, harus ekstra menyadari apa yang anda're termasuk atau tidak termasuk dari test:
Di atas, apakah yang anda maksud untuk memanggil
init_value()
ketika nilai yang ditetapkan secara khusus untukTidak ada
, atau apakah anda berarti bahwa nilai yang ditetapkan ke0
, atau string kosong, atau daftar kosong juga harus memicu inisialisasi. Seperti yang aku bilang, berhati-hati. Sebagai it's sering terjadi di Python eksplisit lebih baik dari implisit.None
dalam praktek #Tidak ada
yang digunakan sebagai nilai sinyalTidak
memiliki status khusus di Python. It's favorit dasar nilai karena banyak algoritma memperlakukannya sebagai nilai yang luar biasa. Dalam skenario seperti itu dapat digunakan sebagai bendera untuk menandakan bahwa suatu kondisi yang memerlukan penanganan khusus (seperti pengaturan nilai default). Anda dapat menetapkanTidak
untuk kata kunci argumen dari fungsi dan kemudian secara eksplisit tes untuk itu.Anda dapat mengembalikannya sebagai default ketika mencoba untuk mendapatkan ke objek's atribut dan kemudian secara eksplisit tes untuk itu sebelum melakukan sesuatu yang khusus.
Secara default kamus's
get()
mengembalikanTidak
ketika mencoba untuk mengakses non-kunci yang ada:Jika anda mencoba untuk mengaksesnya dengan menggunakan subscript notasi yang
KeyError
akan dinaikkanDemikian juga jika anda mencoba untuk pop non-item ada
yang dapat anda menekan dengan nilai default yang biasanya diatur ke
None
None
digunakan sebagai bendera dan nilai yang berlakuYang dijelaskan di atas menggunakan
Tidak
berlaku saat itu tidak dianggap nilai yang berlaku, tetapi lebih seperti sebuah sinyal untuk melakukan sesuatu yang khusus. Ada situasi namun di mana ia kadang-kadang penting untuk tahu di manaNone
datang dari karena meskipun itu's digunakan sebagai sinyal ini juga bisa menjadi bagian dari data. Ketika anda meminta objek untuk atribut dengangetattr(some_obj, 'attribute_name', Tidak ada)
kembaliNone
doesn't memberitahu anda jika atribut yang ingin anda akses ditetapkan untukTidak ada
atau jika itu sama sekali absen dari objek. Situasi yang sama ketika mengakses sebuah kunci dari kamus sepertisome_dict.mendapatkan('some_key')
, anda don't tahu jikasome_dict['some_key']
hilang atau jika itu's hanya mengatur keNone
. Jika anda membutuhkan informasi itu, cara yang biasa untuk menangani ini adalah untuk langsung mencoba mengakses atribut atau kunci dari hanyamencoba/kecuali
membangun:Demikian pula dengan dict:
Di atas dua contoh yang menunjukkan bagaimana untuk menangani objek dan kamus kasus, apa tentang fungsi? Hal yang sama, tapi kita menggunakan tanda bintang ganda kata kunci argumen untuk itu:
None
hanya digunakan sebagai nilai yang berlakuJika anda menemukan bahwa kode anda dipenuhi dengan hal tersebut di atas
mencoba/kecuali
pola hanya untuk membedakan antaraNone
benderaTidak ada data
, maka hanya menggunakan tes lain nilai. Ada's sebuah pola di mana nilai yang berada di luar himpunan nilai yang berlaku dimasukkan sebagai bagian dari data dalam struktur data dan digunakan untuk kontrol dan tes kondisi khusus (misalnya batas wilayah, negara, dll). Nilai tersebut disebut sentinel dan hal ini dapat digunakan dengan cara yangTidak ada
yang digunakan sebagai sinyal. It's sepele untuk menciptakan sentinel di Python.The
undefined
objek di atas adalah unik dan doesn't melakukan apa-apa yang mungkin menarik untuk sebuah program,'s jadi pengganti yang sangat baik untukTidak ada
sebagai bendera. Beberapa peringatan berlaku, lebih banyak tentang itu setelah kode. Dengan fungsiDengan dict
Dengan objek
Seperti yang saya sebutkan sebelumnya kustom penjaga datang dengan beberapa peringatan. Pertama, mereka're tidak kata kunci seperti
Tidak
, sehingga python doesn't melindungi mereka. Anda dapat menimpa andaundefined
di atas setiap saat, di mana saja di modul itu's didefinisikan, jadi hati-hati bagaimana anda mengekspos dan menggunakan mereka. Berikutnya, contoh dikembalikan olehobjek()
adalah tidak tunggal, jika anda membuat panggilan 10 kali anda mendapatkan 10 objek yang berbeda. Akhirnya, penggunaan sentinel adalah sangat istimewa. Sentinel adalah khusus untuk perpustakaan itu's digunakan dalam dan ruang lingkup umumnya harus terbatas ke perpustakaan's internal. Seharusnya't "bocoran" out. Eksternal kode hanya harus menyadari hal itu, jika tujuan mereka adalah untuk memperluas atau menambah perpustakaan's API.It's tidak disebut null seperti dalam bahasa-bahasa lain, tetapi
None
. Selalu ada hanya satu contoh dari objek ini, sehingga anda dapat memeriksa untuk kesetaraan denganx Ada
(identitas perbandingan) dan bukanx == None
, jika anda ingin.Di Python, untuk mewakili tidak adanya nilai, anda dapat menggunakan Tidak ada nilai (jenis.NoneType.Tidak ada) untuk benda-benda dan "" (atau len() == 0) untuk string. Oleh karena itu:
Mengenai perbedaan antara "==" dan "adalah", pengujian mengenai identitas objek menggunakan "==" harus cukup. Namun, sejak operasi "adalah" didefinisikan sebagai identitas objek operasi, hal ini mungkin lebih tepat untuk menggunakannya, bukan "==". Tidak yakin bahkan jika ada perbedaan kecepatan.
Lagi pula, anda bisa melihat-lihat di:
Per Kebenaran nilai pengujian, 'Ada' langsung tes sebagai PALSU, sehingga ekspresi yang paling sederhana akan cukup: