Berbagai cara membersihkan daftar

208

Apakah ada alasan untuk melakukan sesuatu yang lebih rumit daripada salah satu dari dua baris ini ketika Anda ingin menghapus daftar dengan Python?

old_list = []
old_list = list()

Alasan saya bertanya adalah bahwa saya baru saja melihat ini di beberapa kode yang sedang berjalan:

del old_list[ 0:len(old_list) ]
Johannix
sumber
1
Mengapa kau melakukan ini? Pengumpulan Sampah bekerja. Mengapa tidak mengabaikan nilai daftar lama dan membiarkan Python membersihkannya secara otomatis?
S.Lott
40
@ S.Lott: Poster itu tidak menulis kode, dan bertanya mengapa penulis asli mungkin melakukannya.
John Fouhy
1
Anda juga dapat melakukan: sementara l: l.pop ()
RoadieRich
12
LOL. Saya yakin itu efisien.
FogleBird
18
Tidak terkait dengan pertanyaan Anda, tetapi Anda tidak boleh menggunakan len saat menentukan slice. a[:x]berarti mulai ke x dan a[x:]berarti x sampai akhir. a[ 0:len(a) ]dapat ditulis sebagai a[:]. Anda juga dapat menggunakan negatif untuk menghitung dari akhir ( a[-1]adalah elemen terakhir).
idbrii

Jawaban:

358

Menghapus daftar yang ada akan memengaruhi semua referensi lain dari daftar yang sama.

Misalnya, metode ini tidak memengaruhi referensi lain:

>>> a = [1, 2, 3]
>>> b = a
>>> a = []
>>> print(a)
[]
>>> print(b)
[1, 2, 3]

Tapi yang ini:

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]      # equivalent to   del a[0:len(a)]
>>> print(a)
[]
>>> print(b)
[]
>>> a is b
True

Anda juga bisa:

>>> a[:] = []
Koba
sumber
87
Anda juga bisa melakukannyadel a[:]
idbrii
1
Mengapa yang pertama hanya akan berpengaruh a? Saya pikir adan breferensi ke objek yang sama ... Hanya ingin tahu kenapa. Terima kasih.
Alston
38
Dengan python 3.3 dan yang lebih baru Anda bisa menggunakannya a.clear(), tidak masalah!
Marek Lewandowski
4
@Stallman karena pada awalnya Anda mengubah referensi untuk 'a' untuk menunjuk ke array baru, tidak menghapus satu, dan b masih menunjuk yang lama
Pax0r
4
Alangkah baiknya jika ada yang bisa menunjukkan perbedaan kinerja antara metode-metode itu!
Suanmeiguo
37

Melakukan alist = []tidak menghapus daftar, hanya membuat daftar kosong dan mengikatnya ke variabel alist. Daftar lama akan tetap ada jika memiliki binding variabel lainnya.

Untuk benar-benar menghapus daftar di tempat , Anda dapat menggunakan salah satu dari cara ini:

  1. alist.clear() # Python 3.3+, most obvious
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0 # fastest

Lihat halaman dokumentasi Mutable Sequence Type untuk lebih jelasnya.

Eugene Yarmash
sumber
2
Saya telah menguji dan alist * = 0 adalah yang tercepat, tercepat berikutnya adalah alist.clear () dan dua metode lainnya sama-sama cepat. Bisakah Anda jelaskan mengapa alist * = 0 adalah yang tercepat?
Jenny
3
@ Jenny: Ini hanya menggunakan lebih sedikit (atau lebih murah) opcodes di bawah tenda. Misalnya, versi operator tidak perlu mencari nama metode apa pun atau membuat irisan.
Eugene Yarmash
"Seharusnya ada satu - dan lebih baik hanya satu - cara yang jelas untuk melakukannya." Python bersinar di sini :)
Nik O'Lai
36

Ada cara yang sangat sederhana untuk menghapus daftar python. Gunakan del list_name [:] .

Sebagai contoh:

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]
>>> print a, b
[] []
NixMan
sumber
13

Tampak bagi saya bahwa del akan memberikan Anda memori kembali, sementara menetapkan daftar baru akan membuat yang lama dihapus hanya ketika gc runs.matter.

Ini mungkin berguna untuk daftar besar, tetapi untuk daftar kecil itu harus diabaikan.

Sunting : Sebagai Algorias, tidak masalah.

Catat itu

del old_list[ 0:len(old_list) ]

setara dengan

del old_list[:]
Besen
sumber
2
gc tidak dijalankan dalam siklus. Daftar dibebaskan segera setelah referensi terakhirnya dijatuhkan.
Algorias
2
Algorias: itu berlaku untuk CPython, tetapi mungkin tidak untuk implementasi lainnya.
mhsmith
2
del old_list [0: len (old_list)] dan del old_list [:] memiliki hasil yang sama, tetapi yang terakhir lebih cepat (dicentang dengan Python 2.6)
Roy Nieterau
6
del list[:] 

Akan menghapus nilai-nilai variabel daftar itu

del list

Akan menghapus variabel itu sendiri dari memori

ytpillai
sumber
5

Ada dua kasus di mana Anda mungkin ingin menghapus daftar:

  1. Anda ingin menggunakan nama old_listlebih lanjut dalam kode Anda;
  2. Anda ingin daftar lama menjadi sampah yang dikumpulkan sesegera mungkin untuk membebaskan sebagian memori;

Dalam kasus 1 Anda hanya melanjutkan dengan tugas:

    old_list = []    # or whatever you want it to be equal to

Dalam kasus 2 delpernyataan akan mengurangi jumlah referensi ke objek daftar di old listtitik nama . Jika objek daftar hanya menunjuk dengan nama old_listdi, jumlah referensi akan 0, dan objek akan dibebaskan untuk pengumpulan sampah.

    del old_list
Alex
sumber
3

Jika Anda membersihkan daftar, Anda, tentu saja, tidak perlu daftar lagi. Jika demikian, Anda bisa menghapus seluruh daftar dengan metode del sederhana.

a = [1, 3, 5, 6]
del a # This will entirely delete a(the list).

Tetapi jika Anda membutuhkannya lagi, Anda dapat menginisialisasi ulang. Atau cukup dengan menghapus elemen-elemennya

del a[:]
lavee_singh
sumber
-4

solusi lain yang berfungsi dengan baik adalah membuat daftar kosong sebagai referensi daftar kosong.

empt_list = []

misalnya Anda memiliki daftar sebagai a_list = [1,2,3]. Untuk menghapusnya cukup buat yang berikut ini:

a_list = list(empt_list)

ini akan membuat a_listdaftar kosong seperti empt_list.

Mounir Ben
sumber
Tidak ada alasan untuk membuat empt_list. Cukup gunakan a_list = daftar ().
Daniel Harding