Saya tidak dapat memikirkan alasan mengapa python membutuhkan del
kata kunci (dan sebagian besar bahasa tampaknya tidak memiliki kata kunci yang serupa). Sebagai contoh, alih-alih menghapus variabel, seseorang bisa langsung menugaskannya None
. Dan ketika menghapus dari kamus, sebuah del
metode dapat ditambahkan.
Apakah ada alasan untuk tetap del
menggunakan python, atau hanya sisa-sisa masa pengumpulan sampah sebelum Python?
python
dictionary
python-internals
del
Jason Baker
sumber
sumber
del
.del
bukan merupakan sisa pengumpulan sampah sebelum Anda dapat selalu melakukannyaused = None
. Itu selalu masuk akal untuk memiliki sintaks khusus untuk itu. Karena kami memiliki GC GC sekarang, kasus di mana Anda ingin menggunakan keduanya kecil.ERASE
(membunuh variabel tertentu) danCLEAR
(membunuh semua variabel)Jawaban:
Pertama, Anda dapat del hal-hal lain selain variabel lokal
Keduanya harus jelas bermanfaat. Kedua, menggunakan
del
variabel lokal membuat maksud menjadi lebih jelas. Membandingkan:untuk
Saya tahu dalam kasus ini
del foo
tujuannya adalah untuk menghapus variabel dari ruang lingkup. Tidak jelasfoo = None
apakah melakukan itu. Jika seseorang baru saja ditugaskanfoo = None
saya mungkin berpikir itu kode mati. Tapi saya langsung tahu apa yang seseorangdel foo
coba lakukan.sumber
del
digunakan dalam perhitungan intensif memori, tetapi ketika saya melihatnya saya segera menyadari mengapa itu perlu.del
untuk memberi sinyal niat (karena komentar dapat melakukan hal yang sama tanpa menambahkan bahasa), tapi saya kira itu jawaban terbaik.len()
fungsi dengan cara yang sama. Jika ini masalahnya, pertanyaannya mungkin telah ditutup sebagai pendapat atau bahkan berdasarkan selera. Python cenderung memberikan primitif untuk operasi dasar daripada mengandalkan metode.Ada bagian ini dari apa
del
(dari Python Language Reference ):Menetapkan
None
nama tidak menghapus pengikatan nama dari namespace.(Saya kira mungkin ada beberapa perdebatan tentang apakah menghapus ikatan nama sebenarnya berguna , tapi itu pertanyaan lain.)
sumber
del
menghapus nama yang mengikat saat ia menyarankan untuk ditugaskanNone
sebagai alternatif.NameError
. Greg Hewgill membuat perbedaan ini. Dan perbedaan inilah yang membuat pernyataan Anda tentang apa yang "jelas" dipahami poster itu tidak jelas bagi saya.Satu tempat yang menurut saya
del
berguna adalah membersihkan variabel asing untuk loop:Sekarang Anda dapat yakin bahwa x akan tidak terdefinisi jika Anda menggunakannya di luar for for loop.
sumber
del
baris Anda di sini seharusnya diberi indentasi (yaitu bagian dari loop)?NameError: name 'x' is not defined
jika daftar kosong.Menghapus variabel berbeda dari mengaturnya ke Tidak ada
Menghapus nama variabel dengan
del
mungkin adalah sesuatu yang jarang digunakan, tetapi itu adalah sesuatu yang tidak dapat dicapai secara sepele tanpa kata kunci. Jika Anda dapat membuat nama variabel dengan menulisa=1
, alangkah baiknya Anda secara teoritis dapat membatalkan ini dengan menghapus a.Dalam beberapa kasus, proses debug bisa lebih mudah karena mencoba mengakses variabel yang dihapus akan meningkatkan NameError.
Anda dapat menghapus atribut instance kelas
Python memungkinkan Anda menulis sesuatu seperti:
Jika Anda memilih untuk menambahkan atribut secara dinamis ke instance kelas, Anda tentu ingin dapat membatalkannya dengan menulis
sumber
Ada contoh spesifik kapan Anda harus menggunakan
del
(mungkin ada yang lain, tapi saya tahu tentang ini begitu saja) ketika Anda menggunakansys.exc_info()
untuk memeriksa pengecualian. Fungsi ini mengembalikan tupel, jenis pengecualian yang dimunculkan, pesan, dan traceback.Dua nilai pertama biasanya cukup untuk mendiagnosis kesalahan dan menindaklanjutinya, tetapi yang ketiga berisi seluruh tumpukan panggilan antara tempat pengecualian dimunculkan dan di mana pengecualian ditangkap. Khususnya, jika Anda melakukan sesuatu seperti
traceback,
tb
berakhir di penduduk setempat dari tumpukan panggilan, membuat referensi melingkar yang tidak dapat dikumpulkan sampah. Dengan demikian, penting untuk dilakukan:untuk mematahkan referensi melingkar. Dalam banyak kasus di mana Anda ingin memanggil
sys.exc_info()
, seperti dengan sihir metaclass, traceback yang adalah berguna, sehingga Anda harus memastikan bahwa Anda membersihkannya sebelum Anda mungkin dapat meninggalkan handler pengecualian. Jika Anda tidak memerlukan traceback, Anda harus segera menghapusnya, atau cukup lakukan:Untuk menghindarinya bersama-sama.
sumber
Hanya pemikiran lain.
Ketika men-debug aplikasi http dalam kerangka kerja seperti Django, tumpukan panggilan penuh variabel yang tidak berguna dan kacau yang sebelumnya digunakan, terutama ketika itu adalah daftar yang sangat panjang, bisa sangat menyakitkan bagi pengembang. jadi, pada titik ini, mengendalikan namespace bisa bermanfaat.
sumber
Menggunakan "del" secara eksplisit juga merupakan praktik yang lebih baik daripada menugaskan variabel ke Tidak ada. Jika Anda mencoba untuk del variabel yang tidak ada, Anda akan mendapatkan kesalahan runtime tetapi jika Anda mencoba untuk mengatur variabel yang tidak ada ke None, Python akan secara diam-diam mengatur variabel baru ke None, meninggalkan variabel yang Anda ingin dihapus di tempat itu. Jadi del akan membantu Anda menangkap kesalahan Anda sebelumnya
sumber
Untuk menambahkan beberapa poin ke jawaban di atas:
del x
Definisi
x
menunjukkanr -> o
(referensir
menunjuk ke suatu objeko
) tetapidel x
berubahr
daripadao
. Ini adalah operasi pada referensi (pointer) ke objek daripada objek yang terkait dengannyax
. Membedakan antarar
dano
merupakan kunci di sini.locals()
.globals()
jikax
ada di sana.x
milik, bukan tempatx
menunjuk. Satu-satunya perubahan fisik dalam ingatan adalah ini. Misalnya jikax
ada dalam kamus atau daftar, itu (sebagai referensi) dihapus dari sana (dan tidak harus dari kumpulan objek). Dalam contoh ini, kamus yang dimilikinya adalah bingkai tumpukan (locals()
), yang tumpang tindih denganglobals()
.sumber
Paksa menutup file setelah menggunakan numpy.load:
Penggunaan niche mungkin tapi saya merasa berguna saat menggunakan
numpy.load
untuk membaca file. Sesekali saya akan memperbarui file dan perlu menyalin file dengan nama yang sama ke direktori.Saya biasa
del
melepaskan file dan mengizinkan saya untuk menyalin di file baru.Catatan Saya ingin menghindari
with
manajer konteks karena saya bermain-main dengan plot pada baris perintah dan tidak ingin banyak menekan tab!Lihat pertanyaan ini .
sumber
__del__()
metode pada objek sampah dipanggil atau bahkan jika dipanggil sama sekali. Jadi API yang tidak menawarkan cara untuk melepaskan sumber daya selain berharap__del__()
metode dipanggil beberapa saat (segera setelah objeknya sampah) rusak sampai batas tertentu.del
sering terlihat dalam__init__.py
file. Setiap variabel global yang didefinisikan dalam suatu__init__.py
file secara otomatis "diekspor" (akan dimasukkan dalam afrom module import *
). Salah satu cara untuk menghindari ini adalah dengan mendefinisikan__all__
, tetapi ini bisa berantakan dan tidak semua orang menggunakannya.Misalnya, jika Anda memiliki kode
__init__.py
sukaMaka modul Anda akan mengekspor
sys
nama. Anda sebaiknya menulissumber
Sebagai contoh dari apa yang
del
dapat digunakan untuk, saya merasa berguna dalam situasi seperti ini:Kedua fungsi dapat di berbagai paket / modul dan programmer tidak perlu tahu apa nilai default argumen
c
dif
benar-benar memiliki. Jadi dengan menggunakan kwarg dalam kombinasi dengan del Anda dapat mengatakan "Saya ingin nilai default pada c" dengan mengaturnya ke None (atau dalam hal ini juga biarkan).Anda dapat melakukan hal yang sama dengan sesuatu seperti:
Namun saya menemukan contoh sebelumnya lebih KERING dan elegan.
sumber
Anda dapat menggunakannya untuk menghapus satu elemen array bukan sintaks slice
x[i:i+1]=[]
. Ini mungkin berguna jika misalnya Anda berada dios.walk
dan ingin menghapus elemen dalam direktori. Saya tidak akan menganggap kata kunci berguna untuk ini, karena orang hanya bisa membuat[].remove(index)
metode (.remove
metode ini sebenarnya mencari-dan-hapus-contoh-nilai-pertama).sumber
[].pop(index)
dan[].remove(item)
. Jangan gunakan variabel bernama"index"
ketika berbicara tentang nilai, membuatnya terlihat membingungkan.Saya menemukan
del
berguna untuk manajemen memori pseudo-manual ketika menangani data besar dengan Numpy. Sebagai contoh:Ini bisa menjadi perbedaan antara membawa skrip terhenti saat sistem bertukar sangat gila ketika Python GC tidak dapat mengimbangi, dan itu berjalan sangat halus di bawah ambang memori yang longgar yang membuat banyak ruang kepala menggunakan mesin untuk menelusuri dan kode saat sedang bekerja.
sumber
Saya pikir salah satu alasan bahwa del memiliki sintaks sendiri adalah bahwa menggantinya dengan fungsi mungkin sulit dalam kasus-kasus tertentu mengingat beroperasi pada pengikatan atau variabel dan bukan nilai referensi itu. Jadi, jika versi fungsi del dibuat konteks perlu dilewati. Del foo perlu menjadi global (). Remove ('foo') atau lokal (). Remove ('foo') yang menjadi berantakan dan kurang bisa dibaca. Masih saya katakan menyingkirkan del akan baik mengingat penggunaannya yang tampaknya jarang. Tetapi menghapus fitur / kekurangan bahasa bisa menyakitkan. Mungkin python 4 akan menghapusnya :)
sumber
Saya ingin menguraikan jawaban yang diterima untuk menyoroti nuansa antara menetapkan variabel
None
dibandingkan menghapusnya dengandel
:Diberikan variabel
foo = 'bar'
, dan definisi fungsi berikut:Setelah awalnya dinyatakan,
test_var(foo)
hasilvariable tested true
seperti yang diharapkan.Sekarang coba:
yang menghasilkan
variable tested false
.Bandingkan perilaku ini dengan:
yang sekarang memunculkan
NameError: name 'foo' is not defined
.sumber
Namun penggunaan niche lainnya: Di pyroot dengan ROOT5 atau ROOT6, "del" mungkin berguna untuk menghapus objek python yang merujuk ke objek C ++ yang sudah tidak ada lagi. Ini memungkinkan pencarian dinamis dari pyroot untuk menemukan objek C ++ yang identik dinamai dan mengikatnya ke nama python. Jadi Anda dapat memiliki skenario seperti:
Semoga ceruk ini akan ditutup dengan manajemen objek ROOT7 yang lebih waras.
sumber
Perintah "del" sangat berguna untuk mengendalikan data dalam array, misalnya:
Keluaran:
['B', 'C', 'D']
sumber
Pernah saya harus menggunakan:
karena hanya menggunakan:
tidak merilis port serial dengan cukup cepat untuk segera membukanya lagi. Dari pelajaran yang saya pelajari itu
del
benar - benar berarti: "GC SEKARANG! Dan tunggu sampai selesai" dan itu benar-benar berguna dalam banyak situasi. Tentu saja, Anda mungkin punyasystem.gc.del_this_and_wait_balbalbalba(obj)
.sumber
__del__()
selalu salah dengan Python (saya tidak tahu alasan untuk desain ini, meskipun) dan lebih baik menggunakan konteks manager API (with
pernyataan).serial
Modul juga bekerja dengan Jython sehingga Anda hack tidak bekerja di sana!del adalah setara dengan "tidak disetel" dalam banyak bahasa dan sebagai titik referensi silang pindah dari bahasa lain ke python .. orang cenderung mencari perintah yang melakukan hal yang sama seperti dulu dalam bahasa pertama mereka ... juga mengatur var ke "" atau tidak ada yang tidak benar-benar menghapus var dari scope..it hanya mengosongkan nilainya nama var itu sendiri masih akan disimpan dalam memori ... mengapa?!? dalam skrip memori intensif..membersihkan sampah di belakangnya hanya no no dan anyways ... setiap bahasa di luar sana memiliki beberapa bentuk fungsi var "unset / delete" .. mengapa tidak python?
sumber
del
tidak meminta pengumpul sampah lebih cepat daripada= None
, juga tidak akan meninggalkan sampah dalam jangka panjang. Anda mungkin ingin mendapatkan koleksi sampah Python.Setiap objek dalam python memiliki pengidentifikasi, tipe, jumlah referensi yang terkait dengannya, ketika kita menggunakan del jumlah referensi berkurang, ketika jumlah referensi menjadi nol itu adalah kandidat potensial untuk mengumpulkan sampah. Ini membedakan del bila dibandingkan dengan menetapkan pengidentifikasi ke Tidak ada. Dalam kasus selanjutnya, itu berarti objek dibiarkan liar (sampai kita berada di luar ruang lingkup dalam hal ini jumlah berkurang) dan sekarang pengidentifikasi menunjuk ke beberapa objek lain (lokasi memori).
sumber