Listeleri temizlemenin farklı yolları


207

Python'da bir listeyi silmek istediğinizde, bu iki satırdan birinden daha karmaşık bir şey yapmak için herhangi bir neden var mı?

old_list = []
old_list = list()

Ben sormak nedeni sadece bazı çalışan kodda gördüm:

del old_list[ 0:len(old_list) ]

1
Bunu neden yapıyorsun? Çöp Toplama işleri. Neden eski liste değerini görmezden gelip Python'un otomatik olarak temizlemesine izin vermiyorsunuz?
S.Lott

40
@ S.Lott: Poster kodu yazmadı ve orijinal yazarın neden böyle yaptığını soruyor.
John Fouhy

1
Şunu da yapabilirsiniz: while l: l.pop ()
RoadieRich

12
LOL. Eminim bu etkili.
FogleBird

18
Sorunuzla ilgili değil, ancak bir dilim belirtirken len kullanmamalısınız. a[:x]"x" ile başlayan ve a[x:]x ile biten anlamına gelir. a[ 0:len(a) ]olarak yazılabilir a[:]. Negatifleri a[-1]sondan saymak için de kullanabilirsiniz ( son öğedir).
idbrii

Yanıtlar:


356

Bir listenin yerinde temizlenmesi, aynı listenin diğer tüm referanslarını etkiler.

Örneğin, bu yöntem diğer referansları etkilemez:

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

Ama bunu yapar:

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

Ayrıca şunları da yapabilirsiniz:

>>> a[:] = []

86
del a[:]
Şunu

1
İlki neden sadece etkileyecek a? Düşündüm ave baynı nesneye atıfta bulundum ... Sadece nedenini bilmek istiyorum. Teşekkürler.
Alston

37
İle piton 3.3 ve daha sonra birlikte gidebilir a.clear(), hiçbir problem!
Marek Lewandowski

4
@Stallman çünkü önce 'a' için referansı yeni diziyi işaret edecek şekilde değiştiriyorsunuz, birini temizlemiyorsunuz ve b hala eskisini gösteriyor
Pax0r

4
Herkes bu yöntemler arasındaki performans farkını gösterebilirse harika olurdu!
Suanmeiguo

37

Bunu yapmak alist = []listeyi temizlemez, sadece boş bir liste oluşturur ve değişkene bağlar alist. Diğer değişken bağlamaları varsa eski liste yine de mevcut olacaktır.

Bir listeyi yerinde temizlemek için şu yollardan herhangi birini kullanabilirsiniz:

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

Daha fazla ayrıntı için Değişken Dizi Türleri belge sayfasına bakın.


2
Test ettik ve alist * = 0 en hızlı, bir sonraki en hızlı alist.clear () ve diğer iki yöntem de eşit derecede hızlı. Alist * = 0'ın neden en hızlı olduğunu açıklayabilir misiniz?
Jenny

3
@Jenny: Kaputun altında daha az (veya daha ucuz) opcode kullanır . Örneğin, operatör sürümünün herhangi bir yöntem adı aramasına veya dilimler oluşturmasına gerek yoktur.
Eugene Yarmash

"Bunu yapmanın bir - ve tercihen bir - açık yolu olmalı." Python burada parlıyor :)
Nik O'Lai

36

Bir python listesini temizlemenin çok basit bir yolu var. Del list_name [:] kullanın .

Örneğin:

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

13

Bana del'in hafızayı geri vereceği anlaşılıyor, yeni bir liste atarken eski listeyi sadece gc runs.matter olduğunda silinecek.

Bu, büyük listeler için yararlı olabilir, ancak küçük liste için ihmal edilebilir olmalıdır.

Edit : Algorias olarak, önemli değil.

Bunu not et

del old_list[ 0:len(old_list) ]

eşittir

del old_list[:]

2
gc döngüler halinde çalıştırılmaz. Liste, son referansı bırakılır kaldırılmaz serbest bırakılır.
Algorias

2
Algorias: Bu CPython için geçerlidir, ancak diğer uygulamalar için geçerli olmayabilir.
mhsmith

2
del old_list [0: len (old_list)] ve del old_list [:] aynı sonucu veriyor, ancak ikincisi daha hızlı (Python 2.6'da kontrol edildi)
Roy Nieterau

6
del list[:] 

Bu liste değişkeninin değerlerini silecek

del list

Değişkenin kendisini bellekten siler


5

Bir listeyi silmek isteyebileceğiniz iki durum vardır:

  1. Adı kullanmak istiyorsun old_listKodu kodunuzda daha fazla ;
  2. Hafızada yer açmak için eski listenin en kısa zamanda çöp toplanmasını istiyorsunuz;

Durum 1'de sadece tahsisat ile devam edersiniz:

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

2 durumunda delifade, adın old listişaret ettiği liste nesnesine başvuru sayısını azaltır . Liste nesnesi yalnızca old_listadresindeki isimle işaretlenirse , referans sayısı 0 olur ve nesne çöp toplama için serbest bırakılır.

    del old_list

3

Listeyi temizliyorsanız, artık listeye artık ihtiyacınız yok. Öyleyse, basit del yöntemiyle tüm listeyi silebilirsiniz.

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

Ancak tekrar ihtiyacınız olması durumunda, yeniden başlatabilirsiniz. Veya sadece öğelerini

del a[:]

-4

iyi çalışan başka bir çözüm, boş liste referans boş liste olarak oluşturmaktır.

empt_list = []

örneğin olarak bir listeniz var a_list = [1,2,3]. Temizlemek için aşağıdakileri yapmanız yeterlidir:

a_list = list(empt_list)

bu, a_listtıpkı. gibi boş bir liste yapar empt_list.


Empt_list oluşturmak için bir neden yok. Sadece a_list = list () kullanın.
Daniel Harding
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.