2009-09-09 47 views
279

它似乎很「髒」,在這種方式清空列表:如何在Python中清空列表?

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

是否明確的方式存在,要做到這一點?

+22

那麼,爲什麼python字典和集有一個clear()方法,但不是列表? – job

+13

但是,如果有多個對象的引用,它可能是有用的。 –

+3

如果我需要在運行時清除進程上的共享列表並且不需要等待garbaging(或者我錯了嗎?我誤解垃圾回收了嗎?),這可能會很有用。此外,如果我想檢查每個彈出的元素,我可以調試它,而我無法使用切片(或者我錯了)。清除我的清單時,我不需要停止流程執行。 – DrFalk3n

回答

475

這實際上從列表中移除的內容,但不與一個新的空單取代舊標籤:

del lst[:] 

下面是一個例子:

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

爲了完整起見,切片分配具有相同的效果:

lst[:] = [] 

它也可以用來縮小pa同時替換零件(但不在問題的範圍內)。

請注意,如果lst = []不會清空列表,只是創建一個新對象並將其綁定到變量lst,但舊列表仍將具有相同的元素,並且如果具有其他變量綁定,則效果將顯而易見。

+2

還有兩個問題:什麼是「del」? (我推斷它刪除了東西,但我不知道它是什麼)和第二:你怎麼讀(大聲)[:] – OscarRyz

+1

對於del的一個聲音解釋,我會參考文檔: http://docs.python.org/reference/simple_stmts.html#the-del-statement – fortran

+13

我通常不會讀出大聲的Python代碼xD,但如果我不得不我想我會說「從開始分片到列表末尾「。 – fortran

-4
list = [] 

會將list重置爲空列表。

請注意,您通常不應該保留保留的函數名稱,例如list,它是列表對象的構造函數 - 例如,您可以使用lstlist_

+32

否:這不會修改列表,這只是將一個空列表分配給變量list。如果你期望一個函數修改傳入的列表(例如),這不會做你想要的。 –

+0

這個問題很模糊。 –

+9

不是。問題是「如何清空列表」而不是「如何通過包含列表的變量進行分配」 –

51

你可以嘗試:

alist[:] = [] 

這意味着:拼接列表[](0元)的位置[:](從開始的所有索引完成)

的[:]是片運營商。有關更多信息,請參閱this question

+1

爲什麼不只是'alist = []'? – mitenka

+8

@mitenka不清空這個列表,它用一個不同的列表覆蓋變量'alist',這個列表恰好是空的。如果其他人提及了原始列表,則保持原樣(即,它包含了開頭的任何東西) –

27

事實證明,使用Python 2.5.2,del l[:]比使用1.1 usec的l[:] = []稍慢。

$ 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

好點,經過這麼多時間,順便說一句 – DrFalk3n

+1

在Python 2.7.2中,在我的機器上,它們大致相同。它們每個循環的運行時間都是13.5-13.7。 – leetNightshade

+0

您還應該測量python3 -mtimeit「l = list(range(1000))」「b = l [:]」來計算「b [:] = []」和「del b [:]」。做到這一點,大聲笑... – rockdaboot

-1

另一種簡單的代碼,你可以使用(視情況而定)是:

index=len(list)-1 

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

你必須在列表的長度爲起始索引和倒退與指數爲0,前鋒因爲索引等於列表的長度,只會減少一半。

此外,請確保while行有一個「大於或等於」符號。省略它會留下剩餘的列表[0]。

+9

用一個立方體重新發明輪子 –

50

如果你有Python 3。3,或更好,可以使用的listclear()方法,其是平行於dictclear()setdeque和其它可變容器類型:

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

按照鏈接頁面,同樣也可以用alist *= 0實現。