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 = lst1del 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.
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) [:]
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 !):
@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
Python2.5.2
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
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.
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:
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.
Jawaban:
Ini sebenarnya menghapus konten dari daftar, tetapi tidak mengganti label lama dengan daftar kosong baru:
Ini sebuah contoh:
Demi kelengkapan, tugas irisan memiliki efek yang sama:
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 variabellst
, tetapi daftar lama akan tetap memiliki elemen yang sama, dan efeknya akan terlihat jelas jika memiliki binding variabel lain.sumber
Jika Anda menjalankan Python 3.3 atau lebih baik, Anda dapat menggunakan
clear()
metodelist
, yang sejajar denganclear()
daridict
,set
,deque
dan jenis kontainer bisa berubah lainnya: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 !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
sumber
Kamu bisa mencoba:
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.
sumber
alist = []
?alist
dengan 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)alist.clear()
ataualist[:] = []
membantu memeriksa yangalist
benar - benar daftar. Katakanlah Andaalist
kembali dari suatu fungsifoo()
. Anda pikirfoo
mengembalikan daftar tetapi memang mengembalikanNone
. Menggunakanalist = []
tidak bisa menangkap kesalahan itu.ternyata dengan python 2.5.2,
del l[:]
sedikit lebih lambat dibandingkanl[:] = []
dengan 1.1 usec.sumber
.clear()
,del b[:]
danb[:]=[]
semua berjalan sama (b[:]=[]
menjadi sedikit lebih lambat.memiliki efek yang sama dengan
Ini sedikit lebih sederhana dan mungkin lebih mudah diingat. Selain itu, tidak banyak yang bisa dikatakan
Efisiensi tampaknya hampir sama
sumber
0
akan memiliki efek yang sama. Ini adalah trik yang cukup rapi, saya sedikit sedih, bahwa itu tidak mendapat banyak perhatian ..akan mengatur ulang
list
ke daftar kosong.Perhatikan bahwa Anda biasanya tidak membayangi nama fungsi yang dicadangkan, seperti
list
, yang merupakan konstruktor untuk objek daftar - Anda bisa menggunakanlst
ataulist_
sebagai gantinya, misalnya.sumber
list
. Jika Anda mengharapkan fungsi untuk mengubah daftar yang diteruskan (misalnya), ini tidak akan melakukan apa yang Anda inginkan.Kode sederhana lain yang dapat Anda gunakan (tergantung pada situasi Anda) adalah:
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.
sumber