Hapus variabel dalam python

Jawaban:

157

Ada apa dengan ini self.left = None?

bnaul
sumber
19
Tidak terbiasa dengan kata kunci None. Apakah ini mirip dengan null dalam bahasa lain?
Bnicholas
6
Iya; itu sama dengan nol.
Smashery
12
@Bnicholas Namun tidak seperti nulldi PHP, dalam pengaturan variabel ke nulldalam PHP memberi Anda perilaku yang sama dalam banyak kasus seolah-olah Anda tidak mendefinisikannya di tempat pertama. Nilai Nonedalam Python sangat berbeda dari variabel yang tidak terdefinisi. NoneNamun, cukup seperti kebanyakan inkarnasi lainnya null(sampai kita masuk ke detail yang lebih misterius, setidaknya).
Ben
Itu bukan kata kunci; itu adalah nama standar yang ditetapkan untuk objek bawaan. Anda dapat melakukan apa saja dengan Noneyang 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.
Karl Knechtel
18
Buka terminal python dan ketik print xdan 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, menggunakan print xkode akan menghasilkan kata Nonesebagai output. Saya baru mengenal python sehingga saya bisa salah, tetapi ini tidak tampak seperti perilaku dari variabel yang dihapus.
Musixauce3000
408

Kata delkunci akan dilakukan.

>>> a=1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

Tetapi dalam hal ini saya memilih self.left = None

kelaparan
sumber
18
terkadang ini tidak sepenuhnya menghapus ini hanya menghilangkan referensi ke dalam memori. Ini dapat meninggalkan variabel hantu di memori yang tidak mendapatkan gc.
Jakob Bowyer
4
deljuga memiliki kelemahan bahwa jika Anda mencoba untuk menghapus variabel yang tidak ada itu melempar pengecualian, yang biasanya tidak diinginkan.
Philip Kearns
33
Saya hanya ingin menunjukkan bahwa jika Anda secara tidak sengaja mendeklarasikan variabel yang menimpa perintah bawaan misalnya, type=… ketika Anda bermaksud mengetik type(…)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.
mpacer
2
Pengumpulan / Pengumpul / Pengumpul Sampah
mccc
1
Ini yang saya cari. Bermain di garis cmd, saya telah ... set = set(myList)dan kemudian menyadari bahwa saya tidak dapat menggunakan set lagi sebagai fungsi (doh). Menggunakan del setmemungkinkan saya untuk menggunakannya lagi sebagai fx. Tentu saja saya tidak akan pernah menggunakan var yang dipesan itu dalam skrip aktual.
jbchurchill
111

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, Noneakan lebih baik.

pengguna11788
sumber
Bagaimana jika saya ingin sepenuhnya menghapus variabel yang dalam beberapa keadaan tidak ada. Apakah ada parameter untuk menghindari kesalahan? Saya perlu menghapus beberapa variabel: del a, b, c, d Saya bisa menggunakan loop dan mencoba / kecuali, tapi saya lebih suka beberapa saklar untuk menghindarinya.
Tedo Vrbanec
63

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:

del self.left
Viraj Shah
sumber
8
Saya tidak mengerti mengapa jawaban = Tidak ada yang begitu populer. Ini adalah jawaban yang benar
Nikolay Gromov
1
OP mengatakan cleartidak remove. del akan mematikan atribut dan pencarian. Ini adalah cara yang lebih bersih untuk mengaturnya ke Tidak ada, daripada Anda dapat memeriksa if self.leftdan itu akan cukup baik untuk memeriksa apakah sebuah node kosong.
user1767754
"Ini adalah cara yang lebih bersih untuk mengaturnya ke Tidak Ada" - ada baiknya mempertimbangkan bahwa jika seseorang (Anda sendiri beberapa waktu kemudian atau seorang kolaborator) membaca kode del, IMHO, membuatnya lebih jelas bahwa variabel dapat dilupakan ketika 'menguraikan secara mental ' Kode.
Pocketsand
1
@NikolayGromov dalam kode Anda sehari-hari, ketika Anda ingin mendapatkan nilai self.left apakah Anda lebih suka untuk memeriksa 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 ?
Pierre.Sassoulas
33
  • Jika ingin menghapusnya gunakan del:

    del your_variable

  • Atau sebaliknya, untuk membuat nilaiNone :

    your_variable = None

  • Jika iterable (seperti daftar atau tuple), Anda dapat membuatnya kosong seperti:

    your_variable.clear()

Maka your_variableakan kosong

U10-Maju
sumber
Untuk opsi kedua, "kosongkan isinya" tidak benar, ini hanya akan menugaskan kembali variabel ke Tidak ada, objek asli masih akan tetap (kecuali jumlah referensi berkurang menjadi nol dalam hal ini adalah sampah yang dikumpulkan).
cs95
0

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!

Federico Migueletto
sumber
-1

Saya menggunakan beberapa opsi yang disebutkan di atas:

del self.left

atau mengatur nilai ke Tidak menggunakan

self.left = None

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,

print("The value of the variable is {}".format(self.left))

Anda mungkin melihat nilai pencetakan variabel "Nilai variabel tidak ada". Dengan demikian, Anda harus meletakkan beberapa penangan pengecualian di sana:

if self.left:
    #Then only print stuff

Perintah di atas hanya akan mencetak nilai jika self.left tidak None

Navneet Kumar
sumber