Apakah ada cara untuk menghapus nilai variabel dalam python?
Sebagai contoh jika saya menerapkan pohon biner:
Class Node:
self.left = somenode1
self.right = somenode2
Jika saya ingin menghapus beberapa simpul dari pohon, saya perlu mengatur self.left
untuk mengosongkan.
Jawaban:
Ada apa dengan ini
self.left = None
?sumber
null
di PHP, dalam pengaturan variabel kenull
dalam PHP memberi Anda perilaku yang sama dalam banyak kasus seolah-olah Anda tidak mendefinisikannya di tempat pertama. NilaiNone
dalam Python sangat berbeda dari variabel yang tidak terdefinisi.None
Namun, cukup seperti kebanyakan inkarnasi lainnyanull
(sampai kita masuk ke detail yang lebih misterius, setidaknya).None
yang dapat Anda lakukan dengan objek "biasa" lainnya dari jenis yang tidak ditentukan: simpan dalam wadah, cetak representasi stringnya, periksa beberapa metadata di atasnya ... Pokoknya, apakah Anda mencoba Google untuk "python null setara " Aku serius; itu akan mengambil sedikit analisis, tetapi informasinya ada di sana.print x
dan tekan enter. Ini akan menghasilkan kesalahan penerjemah, seperti halnya sebagian besar bahasa ketika Anda mencoba mencetak variabel yang tidak ditentukan. Tetapi jika Anda mendefinisikan variabel, dan kemudian mencoba untuk menghapusnya dengan None, menggunakanprint x
kode akan menghasilkan kataNone
sebagai output. Saya baru mengenal python sehingga saya bisa salah, tetapi ini tidak tampak seperti perilaku dari variabel yang dihapus.Kata
del
kunci akan dilakukan.Tetapi dalam hal ini saya memilih
self.left = None
sumber
del
juga memiliki kelemahan bahwa jika Anda mencoba untuk menghapus variabel yang tidak ada itu melempar pengecualian, yang biasanya tidak diinginkan.type=…
ketika Anda bermaksud mengetiktype(…)
maka menghapusnya adalah cara termudah untuk mendapatkan kembali fungsionalitas asli. Yaitu, jika Anda mempertahankannya sebagai None, Anda masih akan memotong akses ke fungsi yang mendasarinya.set = set(myList)
dan kemudian menyadari bahwa saya tidak dapat menggunakan set lagi sebagai fungsi (doh). Menggunakandel set
memungkinkan saya untuk menggunakannya lagi sebagai fx. Tentu saja saya tidak akan pernah menggunakan var yang dipesan itu dalam skrip aktual.var = None
"membersihkan nilai", mengatur nilai variabel ke "null" seperti nilai "Tidak Ada", namun penunjuk ke variabel tetap.del var
menghapus definisi untuk variabel secara total.Jika Anda ingin menggunakan variabel nanti, mis. Menetapkan nilai baru untuk itu, yaitu mempertahankan variabel,
None
akan lebih baik.sumber
Sebenarnya, itu tidak menghapus variabel / properti. Yang akan dilakukan hanyalah mengatur nilainya
None
, karena itu variabel akan tetap memakan ruang dalam memori. Jika Anda ingin menghapus seluruh keberadaan variabel dari memori, Anda cukup mengetik:sumber
clear
tidakremove
. del akan mematikan atribut dan pencarian. Ini adalah cara yang lebih bersih untuk mengaturnya ke Tidak ada, daripada Anda dapat memeriksaif self.left
dan itu akan cukup baik untuk memeriksa apakah sebuah node kosong.del
, IMHO, membuatnya lebih jelas bahwa variabel dapat dilupakan ketika 'menguraikan secara mental ' Kode.if self.left:
, atau apakah Anda lebih suka berurusan dengan kemungkinan pengecualian NameError yang akan merusak program Anda jika Anda tidak menanganinya di mana-mana ?Jika ingin menghapusnya gunakan
del
:del your_variable
Atau sebaliknya, untuk membuat nilai
None
:your_variable = None
Jika iterable (seperti daftar atau tuple), Anda dapat membuatnya kosong seperti:
your_variable.clear()
Maka
your_variable
akan kosongsumber
Apakah Anda ingin menghapus variabel, bukan?
ok, saya rasa saya punya ide alternatif terbaik untuk @bnul jawab:
Anda dapat menghapus nama individual dengan
del
:del x
atau Anda dapat menghapusnya dari objek globals ():for name in dir(): if not name.startswith('_'): del globals()[name]
Ini hanyalah contoh loop; secara defensif hanya menghapus nama-nama yang tidak dimulai dengan garis bawah, membuat (bukan tanpa alasan) asumsi bahwa Anda hanya menggunakan nama tanpa garis bawah pada awal penerjemah Anda. Anda bisa menggunakan daftar nama yang dikodekan untuk disimpan (daftar putih) jika Anda benar-benar ingin teliti. Tidak ada fungsi bawaan untuk melakukan pembersihan untuk Anda, selain hanya keluar dan memulai kembali penerjemah.
Modul yang telah Anda impor (import os) akan tetap diimpor karena direferensikan oleh sys.modules; impor berikutnya akan menggunakan kembali objek modul yang sudah diimpor. Anda tidak akan memiliki referensi untuk mereka di namespace global Anda saat ini.
Harap pertimbangkan kembali jawaban ini!
sumber
Saya menggunakan beberapa opsi yang disebutkan di atas:
atau mengatur nilai ke Tidak menggunakan
Penting untuk mengetahui perbedaan dan menempatkan beberapa penangan pengecualian di tempat ketika Anda menggunakan set nilainya menjadi Tidak ada. Jika Anda mencetak nilai pernyataan bersyarat menggunakan templat, katakan,
Anda mungkin melihat nilai pencetakan variabel "Nilai variabel tidak ada". Dengan demikian, Anda harus meletakkan beberapa penangan pengecualian di sana:
Perintah di atas hanya akan mencetak nilai jika self.left tidak
None
sumber