Bagaimana cara mengosongkan daftar?

356

Tampaknya sangat "kotor" mengosongkan daftar dengan cara ini:

while len(alist) > 0 : alist.pop()

Apakah ada cara yang jelas untuk melakukan itu?

DrFalk3n
sumber
28
Jadi mengapa python dicts dan set memiliki metode yang jelas (), tetapi tidak daftar?
job
13
Tetapi jika ada banyak referensi ke objek, itu mungkin berguna.
Ned Deily,
3
Mungkin bermanfaat jika saya perlu menghapus daftar yang dibagikan atas proses pada waktu berjalan dan tidak perlu menunggu pembongkaran (atau apakah saya salah? Apakah saya salah memahami pengumpulan sampah?). Juga jika saya ingin memeriksa setiap elemen yang muncul saya bisa men-debug-nya sementara saya tidak bisa menggunakan slicing (atau saya salah). Saya tidak perlu menghentikan proses eksekusi saat membersihkan daftar saya.
DrFalk3n
2
@ S.Lott Hanya karena Anda tidak mengerti mengapa ini penting bukan berarti kita semua tidak. Jika beberapa objek bergantung pada daftar umum, itu akan menjadi masalah. Dalam beberapa pola desain, ini penting. Pengumpul sampah berarti Anda tidak perlu membersihkan sendiri; itu bukan lisensi untuk membuat lebih banyak kekacauan.
UpAndAdam
4
Sekalipun ada jawaban lain yang lebih baik, kode awal Anda bisa saja ditulis: while alist: alist.pop ()
MrWerlang

Jawaban:

570

Ini sebenarnya menghapus konten dari daftar, tetapi tidak mengganti label lama dengan daftar kosong baru:

del lst[:]

Ini sebuah contoh:

lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)

Demi kelengkapan, tugas irisan memiliki efek yang sama:

lst[:] = []

Itu juga dapat digunakan untuk mengecilkan bagian dari daftar sambil mengganti bagian pada saat yang sama (tapi itu di luar ruang lingkup pertanyaan).

Perhatikan bahwa melakukan lst = []tidak mengosongkan daftar, hanya membuat objek baru dan mengikatnya ke variabel lst, tetapi daftar lama akan tetap memiliki elemen yang sama, dan efeknya akan terlihat jelas jika memiliki binding variabel lain.

fortran
sumber
3
Dua pertanyaan lebih lanjut: Apa sebenarnya "del" itu? (Saya menyimpulkannya hal-hal del-etes tapi saya tidak benar-benar tahu apa itu) dan ke-2: Bagaimana Anda membaca (dengan suara keras) [:]
OscarRyz
2
Untuk penjelasan yang jelas tentang del, saya akan merujuk ke dokumen: docs.python.org/reference/simple_stmts.html#the-del-statement
fortran
14
Saya biasanya tidak membacakan kode python xD, tetapi jika saya harus, saya pikir saya akan mengatakan "slice dari awal hingga akhir daftar l".
fortran
2
@jellybean benar-benar tidak disengaja ^ _ ^ Bahasa Inggris bukan bahasa ibu saya, jadi saya benar-benar tidak melihat perbedaan antara kedua komentar.
fortran
jika kita lakukan l = [] tidak akankah konten daftar lama mendapatkan sampah dikumpulkan oleh Python GC?
Alex Punnen
168

Jika Anda menjalankan Python 3.3 atau lebih baik, Anda dapat menggunakan clear()metode list, yang sejajar dengan clear()dari dict, set, dequedan jenis kontainer bisa berubah lainnya:

alist.clear()  # removes all items from alist (equivalent to del alist[:])

Sesuai halaman dokumentasi yang ditautkan, hal yang sama juga dapat dicapai dengan alist *= 0.

Singkatnya, ada empat cara yang setara untuk menghapus daftar di tempat (sangat bertentangan dengan Zen Python !):

  1. alist.clear() # Python 3.3+
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0
Eugene Yarmash
sumber
6
Jawaban ini harus di atas, ada apa dengan stackoverflow!
BreakBadSP
clear () lebih baik.
sailfish009
61

Kamu bisa mencoba:

alist[:] = []

Yang berarti: Sambatan dalam daftar [](0 elemen) di lokasi [:](semua indeks dari awal hingga selesai)

[:] Adalah operator slice. Lihat pertanyaan ini untuk informasi lebih lanjut.

Adam Batkin
sumber
4
Kenapa tidak adil alist = []?
mitenka
16
@mitenka yang tidak mengosongkan daftar, itu menimpa variabel alistdengan daftar berbeda yang kebetulan kosong. Jika orang lain memiliki referensi ke daftar asli, itu tetap apa adanya (yaitu berisi apa pun yang ada di dalamnya untuk memulai)
Adam Batkin
@mitenka Alasan lain adalah bahwa alist.clear()atau alist[:] = []membantu memeriksa yang alistbenar - benar daftar. Katakanlah Anda alistkembali dari suatu fungsi foo(). Anda pikir foomengembalikan daftar tetapi memang mengembalikan None. Menggunakan alist = []tidak bisa menangkap kesalahan itu.
aafulei
32

ternyata dengan python 2.5.2, del l[:]sedikit lebih lambat dibandingkan l[:] = []dengan 1.1 usec.

$ python -mtimeit "l=list(range(1000))" "b=l[:];del b[:]"
10000 loops, best of 3: 29.8 usec per loop
$ python -mtimeit "l=list(range(1000))" "b=l[:];b[:] = []"
10000 loops, best of 3: 28.7 usec per loop
$ python -V
Python 2.5.2
Dan D.
sumber
1
Dalam Python 2.7.2, di komputer saya, mereka hampir sama. Keduanya berjalan dari 13.5-13.7 usec per loop.
leetNightshade
Anda juga harus mengukur python3 -mtimeit "l = daftar (rentang (1000))" "b = l [:]" untuk menghitung "b [:] = []" dan "del b [:]". Lakukan dan lol ...
rockdaboot
1
Saya melakukan benchmark dengan python 3.5 dan saya setuju dengan leetNightshade. .clear(), del b[:]dan b[:]=[]semua berjalan sama ( b[:]=[]menjadi sedikit lebih lambat.
Conchylicultor
5
lst *= 0

memiliki efek yang sama dengan

lst[:] = []

Ini sedikit lebih sederhana dan mungkin lebih mudah diingat. Selain itu, tidak banyak yang bisa dikatakan

Efisiensi tampaknya hampir sama

Ivan Hoffmann
sumber
1
Demi kelengkapan itu perlu disebutkan, bahwa setiap bilangan bulat yang diberikan kurang dari atau sama dengan 0akan memiliki efek yang sama. Ini adalah trik yang cukup rapi, saya sedikit sedih, bahwa itu tidak mendapat banyak perhatian ..
Peter Varo
-1
list = []

akan mengatur ulang listke daftar kosong.

Perhatikan bahwa Anda biasanya tidak membayangi nama fungsi yang dicadangkan, seperti list, yang merupakan konstruktor untuk objek daftar - Anda bisa menggunakan lstatau list_sebagai gantinya, misalnya.

Mark Rushakoff
sumber
38
Tidak: ini tidak akan mengubah daftar, ini hanya memberikan daftar kosong ke variabel list. Jika Anda mengharapkan fungsi untuk mengubah daftar yang diteruskan (misalnya), ini tidak akan melakukan apa yang Anda inginkan.
Adam Batkin
10
Tidak juga. Pertanyaannya adalah "Bagaimana cara mengosongkan daftar" tidak "Bagaimana menetapkan variabel yang berisi daftar"
Adam Batkin
6
pertanyaan itu tidak ambigu, potongan op itu muncul elemen dari daftar (hanya itu, memodifikasi itu di tempat) ...
fortran
7
Juga, "daftar" tidak boleh digunakan sebagai nama variabel, karena bayangan jenis "daftar". Banyak pengembang Python menggunakan "L" sebagai nama variabel daftar, tapi saya lebih suka "lst".
steveha
1
Terkadang Anda hanya ingin daftar itu dikosongkan dan ini sama baiknya dengan metode yang diusulkan. Mungkin bahkan lebih cepat
smac89
-3

Kode sederhana lain yang dapat Anda gunakan (tergantung pada situasi Anda) adalah:

index=len(list)-1

while index>=0:
    del list[index]
    index-=1

Anda harus memulai indeks pada panjang daftar dan mundur versus indeks pada 0, ke depan karena itu akan membuat Anda berakhir dengan indeks sama dengan panjang daftar dengan hanya memotong setengah.

Juga, pastikan bahwa garis while memiliki tanda "lebih besar atau sama dengan". Mengabaikannya akan meninggalkan Anda dengan daftar [0] yang tersisa.

Donald
sumber
15
menciptakan kembali roda dengan sebuah kubus
CONvid19
Ha ha. Ini adalah jawaban aneh kedua (+ komentar yang sesuai) yang saya temui di SO. Seharusnya ada situs untuk hal-hal yang tak terlupakan ini: D
akinuri