如何清空列表?


356

用这种方式清空列表似乎太“脏”了:

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

是否存在明确的方法?


28
那么,为什么python字典和集合具有clear()方法,但没有列表?
工作

13
但是,如果有对该对象的多个引用,它可能会很有用。
内德·迪利

3
如果我需要在运行时清除进程的共享列表,而不必等待垃圾处理(这是我错了吗?我误解了垃圾回收吗?),这可能很有用。另外,如果我想检查每个弹出的元素,则可以在不使用切片的情况下调试它(否则我错了)。清除列表时,我不需要停止进程执行。
DrFalk3n

2
@ S.Lott仅仅因为您不明白为什么这很重要并不意味着我们其他人都不知道。如果多个对象依赖一个公共列表,那将很重要。在几种设计模式中,这一点很重要。垃圾收集器意味着您不必自己清理。这不是使更多事情变得混乱的许可证。
UpAndAdam

4
尽管有其他更好的答案,您的初始代码也可能已经写好了:alist:alist.pop()
MrWonderful 2014年

Answers:


570

实际上,这将从列表中删除内容,但不会用新的空列表替换旧标签:

del lst[:]

这是一个例子:

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

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

lst[:] = []

它也可以用于缩小列表的一部分,同时替换一部分(但这超出了问题的范围)。

请注意,这样lst = []做不会清空列表,只是创建一个新对象并将其绑定到变量lst,但是旧列表仍将具有相同的元素,并且如果具有其他变量绑定,效果将显而易见。


3
还有两个问题:“ del”到底是什么?(我推断出它的作用,但我真的不知道是什么),第二:您如何(大声朗读)[:]
OscarRyz


14
我通常不会读出很大的python代码xD,但是如果我不得不的话,我想我会说“从列表的开头到结尾的切片”。
fortran

2
@jellybean完全没用^ _ ^英语不是我的母语,所以我真的没有注意到两个注释之间的对比。
fortran 2010年

如果我们这样做l = [],旧列表内容是否会被Python GC收集到垃圾?
Alex Punnen

168

如果你正在运行的Python 3.3或更好的,你可以使用clear()的方法list,这是平行clear()dictsetdeque和其他易变的容器类型:

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

按照链接的文档页面,也可以使用来实现相同的目的alist *= 0

总结起来,有四种等效的方法可以就地清除列表(与PythonZen完全相反!):

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

6
这个答案应该是最重要的,stackoverflow有什么问题!
BreakBadSP '18

clear()更好。
sailfish009

61

您可以尝试:

alist[:] = []

这意味着:在[]位置[:](从头到尾的所有索引)的列表(0个元素)中拼接

[:]是切片运算符。有关更多信息,请参见此问题


4
为什么不只是alist = []呢?
mitenka

16
@mitenka不会清空列表,它会alist使用另一个恰好为空的列表覆盖变量。如果有其他人引用原始列表,则该列表保持原样(即,其中包含开头的所有内容)
Adam Batkin

@mitenka另一个原因是alist.clear()alist[:] = []有助于检查是否alist确实是列表。假设您alist从函数返回foo()。您以为foo返回了一个列表,但实际上返回了一个None。使用alist = []无法捕获该错误。
aafulei

32

事实证明,使用python 2.5.2的del l[:]速度比l[:] = []使用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

1
在Python 2.7.2中,在我的机器上,它们大致相同。它们每个循环都从13.5-13.7 usec运行。
leetNightshade 2012年

您还应该测量python3 -mtimeit“ l = list(range(1000))”“ b = l [:]”以计算“ b [:] = []”和“ del b [:]”。做到这一点,大声笑...
rockdaboot

1
我使用python 3.5进行了基准测试,并同意leetNightshade。.clear()del b[:]b[:]=[]所有的运行相同(b[:]=[]略慢之中。
Conchylicultor

5
lst *= 0

与...具有相同的效果

lst[:] = []

它稍微简单一些,也许更容易记住。除此之外,无话可说

效率似乎差不多


1
为了完整起见,值得一提的是,任何给定的小于或等于的整数都0将具有相同的效果。这是一个非常巧妙的方法,虽然,我有点伤心,它并没有得到太多的关注..
彼得VARO

-1
list = []

将重置list为空列表。

请注意,通常您不应该遮盖保留的函数名称,例如list,它是列表对象的构造函数- 例如,可以使用lstlist_代替。


38
否:这不会修改列表,只会为该变量分配一个空列表list。如果您希望某个函数修改传入列表(例如),则不会执行您想要的操作。
亚当·巴特金2009年

10
并不是的。问题是“如何清空列表”而不是“如何对包含列表的变量进行赋值”
Adam Batkin 2009年

6
这个问题不是模棱两可,op的代码片段正在将元素从列表中弹出(就是它,就地对其进行了修改)...
fortran 2009年

7
另外,“列表”不应用作变量名,因为阴影是“列表”类型。许多Python开发人员使用“ L”作为列表变量名称,但我更喜欢“ lst”。
steveha

1
有时,您只希望清空列表,这与建议的任何方法一样好。可能甚至更快
smac89 '16

-3

您可以使用的另一个简单代码(取决于您的情况)是:

index=len(list)-1

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

您必须在列表的长度处开始索引,然后相对于索引在0处向前,向后前进,因为这将使您最终获得的索引等于列表的长度,并且仅将其切成两半。

另外,请确保while行上有一个“大于或等于”符号。省略它会使您剩下list [0]。


15
用立方体重塑轮子
CONvid19 '16

哈哈。这是我在SO上遇到的第二个奇怪的答案(加上适当的评论)。这些值得纪念的事物应该有一个站点:D
akinuri
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.