如何清空一个列表?

370

以这种方式清空列表感觉很"不干净":

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

有没有一个清晰的方法来做到这一点?


28
为什么Python字典和集合有clear()方法,而列表没有呢? - job
13
如果对象有多个引用,这可能是有用的。 - Ned Deily
3
如果我需要在运行时清除进程间共享的列表并且不需要等待垃圾回收(或者我理解垃圾回收的方式是错误的?),那么这可能是有用的。此外,如果我想要检查每个弹出的元素,我可以在使用切片无法进行调试时进行调试(或者我理解错误)。我不需要在清除列表时停止进程执行。 - DrFalk3n
2
@S.Lott 只因为您不理解这个的重要性,并不代表我们其他人也不理解。如果多个对象依赖于一个共同的列表,那么这将很重要。在几种设计模式中,这是很重要的。垃圾收集器意味着您不必自己清理;这并不是让您制造更多混乱的许可证。 - UpAndAdam
4
除非有更好的答案,你最初的代码可以这样编写:while alist: alist.pop()。 这句话的意思是在不考虑其他更好的答案的情况下,建议用这段代码来代替原文中提到的代码。其中 while 循环语句的条件为列表 alist 不为空,每次循环通过 pop() 方法弹出列表的最后一个元素。 - MrWonderful
7个回答

587

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

del lst[:]

以下是一个例子:

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

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

lst[:] = []

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

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


3
两个问题:第一个问题是“del”是什么?(我推测它是删除东西的意思,但我不太确定它具体指什么)。第二个问题是,你如何朗读符号“[:]”? - OscarRyz
2
对于 del 命令的详细解释,请参考文档: http://docs.python.org/reference/simple_stmts.html#the-del-statement - fortran
14
通常我不会大声朗读Python代码 xD,但如果必须的话,我想我会说“从列表l的开头切片到结尾”。 - fortran
2
@jellybean 完全是无意的 ^_^ 英语不是我的母语,所以我真的没有注意到这两个评论之间的对比。 - fortran
如果我们执行 l = [],Python GC 会清理旧列表内容吗? - Alex Punnen
显示剩余3条评论

213
如果您正在运行 Python 3.3 或更高版本,则可以使用列表的 clear() 方法,该方法类似于字典、集合、双向队列和其他可变容器类型的 clear() 方法 :clear()list
alist.clear()  # removes all items from alist (equivalent to del alist[:])

根据链接的文档页面,也可以使用alist *= 0来实现清空列表。

总而言之,有四种等效的方法可以原地清空列表(与Python之禅相反!):

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

13
这个答案应该排在顶部,Stack Overflow怎么了! - BreakBadSP
1
你让我笑了,“Python 3.3或更好的版本”哈哈哈。我同意你的看法,它变得越来越好了(我迫不及待地想放弃对Python 2的支持)! - LoneCodeRanger

62
你可以尝试一下:

你可以尝试:

alist[:] = []
这意味着:在位置[:](从头到尾的所有索引)中,将空列表[]插入列表中。 [:]是切片操作符。有关更多信息,请参见此问题

6
为什么不直接使用 alist = [] - mitenka
20
@mitenka这并不是清空列表,它是用一个不同的列表覆盖了变量alist,而这个列表恰好是空的。如果有其他人引用了原始列表,那么它仍然保持不变(即它包含了一开始它所包含的内容)。 - Adam Batkin
@mitenka 另一个原因是 alist.clear()alist[:] = [] 有助于检查 alist 是否真的是一个列表。假设你从函数 foo() 中返回了 alist。你认为 foo 返回了一个列表,但实际上它返回了 None。使用 alist = [] 无法捕捉到这个错误。 - aafulei
我看到了这篇文章,因为我正在寻找一种清空列表的方法,或者至少我认为那是我需要做的。我正在接收数据,并希望根据条件创建子列表并将子列表放入主列表中。自然地,当我使用任何删除方法时,它会删除子列表和我正在附加到主列表中的列表。 Mitenka的建议正是我所需要的。思考一下,我不需要清空子列表,我需要将其重置为一个新列表。对我来说,这不是显而易见的。 Mitenka的建议解决了我的问题。 - Thomas Johnson

32

事实证明,在Python 2.5.2下,del l[:]l[:] = []慢大约1.1微秒。

$ 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微秒之间。 - leetNightshade
你还应该测量python3 -mtimeit "l=list(range(1000))" "b=l[:]"来计算"b[:] = []"和"del b[:]"。做吧,哈哈... - rockdaboot
1
我使用Python 3.5进行了基准测试,并同意leetNightshade的观点。.clear()del b[:]b[:]=[]都运行相同(b[:]=[]略慢一些)。 - Conchylicultor

6
lst *= 0

具有相同的效果

lst[:] = []

这个比较简单,也许更容易记住。除此之外,没有什么好说的。

效率似乎差不多。


1
为了完整起见,值得一提的是,任何小于或等于0的整数都会产生同样的效果。虽然这是一个相当聪明的技巧,但我有点遗憾它没有得到足够的关注。 - Peter Varo

-3
list = []

将重置list为一个空列表。

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


40
不会修改列表,只是将空列表分配给变量“list”。如果您期望函数修改传入的列表(例如),那么这不会做您想要的事情。 - Adam Batkin
10
不是很对。问题是“如何清空一个列表”,而不是“如何覆盖包含列表的变量”。 - Adam Batkin
6
问题并不含糊,原帖中的代码片段正在弹出列表中的元素(也就是说,在原地进行修改)... - fortran
7
“list”不应该作为变量名,因为它会覆盖“list”类型。许多Python开发者使用“L”作为列表变量名,但我更喜欢“lst”。 - steveha
1
有时候您只想清空列表,而这是任何提出的方法中都很好。可能甚至更快速。 - smac89
显示剩余3条评论

-3

另一个你可以使用的简单代码(根据你的情况而定)是:

index=len(list)-1

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

你必须从列表长度开始倒序索引,而不是从0开始正序索引,因为这样会导致索引等于列表长度且仅被切成一半。

此外,请确保 while 行具有“大于或等于”符号。省略它会使 list[0] 保留下来。


19
重复造轮子,但用一个立方体。 - Pedro Lobito
2
哈哈。这是我在SO上遇到的第二个奇怪的回答(+一个适当的评论)。应该有一个网站来记录这些难忘的事情:D - akinuri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接