Bir liste nasıl boşaltılır?


356

Öyle görünüyor ki bir liste bu şekilde boşaltılıyor:

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

Bunu yapmak için açık bir yol var mı?


28
Peki neden python dicts ve setlerinin listeler değil, bir clear () yöntemi var?

13
Ancak nesneye birden fazla başvuru varsa, bu yararlı olabilir.
Ned Deily

3
Çalışma zamanında paylaşılan bir listeyi işlemler sırasında temizlemem gerekirse ve garbaging için beklemem gerekmiyorsa (ya da yanlış mıyım? Çöp toplama işlemini yanlış anladım mı?). Ayrıca ben her patlamış eleman kontrol etmek isterseniz ben dilimleme (ya da ben yanılıyorum) kullanarak iken hata ayıklayabilirsiniz. Listemi silerken işlemin yürütülmesini durdurmam gerekmiyor.
DrFalk3n

2
@ S.Lott Bunun neden önemli olduğunu anlamamanız, geri kalanımızın olmaması anlamına gelmez. Birden fazla nesne ortak bir listeye bağlıysa önemli olacaktır. Çeşitli tasarım modellerinde bu önemlidir. Çöp toplayıcı, kendinizden sonra temizlemeniz gerekmediği anlamına gelir; daha fazla dağınıklık yapmak için bir lisans değil.
UpAndAdam

4
Diğer, daha iyi yanıtlara rağmen, ilk kodunuz yazılmış olabilir: alist.pop ()
MrWonderful

Yanıtlar:


570

Bu aslında içeriği listeden kaldırır, ancak eski etiketi yeni bir boş listeyle değiştirmez:

del lst[:]

İşte bir örnek:

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

Tamlık uğruna, dilim ataması aynı etkiye sahiptir:

lst[:] = []

Aynı zamanda bir parçayı değiştirirken listenin bir kısmını daraltmak için de kullanılabilir (ancak bu sorunun kapsamı dışındadır).

Yapmanın lst = []listeyi boşaltmadığını, yalnızca yeni bir nesne oluşturduğunu ve değişkene bağladığını lst, ancak eski listenin yine de aynı öğelere sahip olacağını ve başka değişken bağlamaları varsa efektin görüneceğini unutmayın.


3
İki soru daha: "del" tam olarak nedir? (Ben bir şeyler çıkarıyorum ama ne olduğunu gerçekten bilmiyorum) ve 2.: Nasıl okuyorsun (yüksek sesle) [:]
OscarRyz


14
Ben genellikle yüksek sesle python kod xD okumaz, ama eğer olsaydı ben "l listenin sonuna dilim" diyebilirim.
fortran

2
@jellybean tamamen istenmeyen ^ _ ^ İngilizce ana dilim değil, bu yüzden iki yorum arasındaki kontrastı gerçekten fark etmedim.
fortran

l = [] yaparsak eski liste içeriği Python GC tarafından toplanamaz.
Alex Punnen

169

Python 3.3 veya daha iyi çalıştırıyorsanız kullanabilirsiniz clear()yöntemini listparalel, clear()bir dict, set, dequeve diğer değişken konteyner tipleri:

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

Bağlantılı dokümantasyon sayfasına göre, aynı şey ile de elde edilebilir alist *= 0.

Özetlemek gerekirse, yerinde bir listeyi temizlemenin dört eşdeğer yolu vardır (Python'un Zen'inin aksine !):

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

6
Bu cevap en üstte olmalı, stackoverflow ile ilgili sorun nedir!
BreakBadSP

61

Deneyebilirsiniz:

alist[:] = []

Bunun anlamı: Listedeki yeri [](0 öğe) konuma [:]ekleme (baştan sona tüm dizinler)

[:] Dilim işlecidir. Daha fazla bilgi için bu soruya bakın .


4
Neden sadece alist = []?
mitenka

16
Listeyi boşaltmayan @mitenka, boş olan alistfarklı bir listeyle değişkenin üzerine yazar . Orijinal listeye başka bir referans varsa, bu olduğu gibi kalır (yani içinde başlamak için ne varsa içerir)
Adam Batkin

@mitenka Başka bir neden, alist.clear()ya da gerçekten bir liste alist[:] = []olduğunu kontrol etmeye yardımcı olur alist. Diyelim ki alistbir işlevden döndün foo(). fooBir liste döndürdüğünü düşündün ama gerçekten bir geri döndü None. Kullanmak alist = []bu hatayı yakalayamaz.
aafulei

32

python 2.5.2 ile 1.1 usec'den del l[:]biraz daha yavaş olduğu ortaya l[:] = []çıkıyor.

$ 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

1
Python 2.7.2'de, makinemde, neredeyse aynılar. Her ikisi de döngü başına 13.5-13.7 usec arasında çalışır.
leetNightshade

Ayrıca "b [:] = []" ve "del b [:]" hesaplamak için python3 -mtimeit "l = list (aralık (1000))" "b = l [:]" ölçmelisiniz. Do it and lol ...
rockdaboot

1
Ben test python 3.5 ile yaptım ve leetNightshade katılıyorum. .clear(), del b[:]Ve b[:]=[]aynı bütün çalışır ( b[:]=[]biraz daha yavaş olmak.
Conchylicultor

5
lst *= 0

ile aynı etkiye sahiptir

lst[:] = []

Biraz daha basit ve hatırlanması belki daha kolay. Bunun dışında söyleyecek çok şey yok

Verimlilik yaklaşık olarak aynı görünüyor


1
Tamlık uğruna, değinilen veya eşit olan herhangi bir tamsayının 0aynı etkiye sahip olacağından bahsetmek gerekir . Çok dikkat çekici bir hile, biraz üzgünüm, fazla ilgi görmediği ..
Peter Varo

-1
list = []

listboş bir listeye sıfırlanır .

Genellikle listbir liste nesnesinin kurucusu olan ayrılmış işlev adlarını gölgelendirmemeniz gerektiğini unutmayın; örneğin lstveya list_yerine kullanabilirsiniz .


38
Hayır: bu listeyi değiştirmez, bu sadece değişkene boş bir liste atar list. Bir işlevin geçirilen bir listeyi değiştirmesini bekliyorsanız (örneğin), bu istediğinizi yapmaz.
Adam Batkin

10
Pek sayılmaz. Soru, "Bir liste nasıl boşaltılır" değil "Liste içeren bir değişken üzerinde nasıl atama yapılır"
Adam Batkin

6
soru belirsiz değildi, op snippet'i öğeleri listeden çıkarıyordu (işte bu, yerinde değiştiriyordu) ...
fortran

7
Ayrıca, "list" türü gölgeler olduğundan "list" değişken adı olarak kullanılmamalıdır. Birçok Python geliştiricisi liste değişkeni adı olarak "L" kullanır, ama ben "lst" tercih ederim.
steveha

1
Bazen listenin boşaltılmasını istersiniz ve bu önerilen yöntemlerden herhangi biri kadar iyidir. Muhtemelen daha da hızlı
smac89

-3

Kullanabileceğiniz bir diğer basit kod (durumunuza bağlı olarak):

index=len(list)-1

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

Dizini listenin uzunluğunda başlatmanız ve dizinde 0'a doğru geri gitmeniz gerekir, çünkü bu sizi listenin uzunluğuna eşit bir dizinle yalnızca yarıya indirilir.

Ayrıca while satırının "büyük veya eşit" işaretine sahip olduğundan emin olun. Bunu atladığınızda, [0] listesi kalır.


15
bir küp ile tekerleği yeniden icat
CONvid19

Haha. Bu SO üzerinde karşılaştığım ikinci garip cevap (+ uygun bir yorum). Bu unutulmaz şeyler için bir site olmalı: D
akinuri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.