以这种方式清空列表感觉很"不干净":
while len(alist) > 0 : alist.pop()
有没有一个清晰的方法来做到这一点?
以这种方式清空列表感觉很"不干净":
while len(alist) > 0 : alist.pop()
有没有一个清晰的方法来做到这一点?
这实际上是从列表中删除内容,但不会用新的空列表替换旧标签:
del lst[:]
以下是一个例子:
lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)
为了完整起见,切片赋值具有相同的效果:
lst[:] = []
它还可以用于在替换部分列表的同时缩小列表的一部分(但这超出了问题的范围)。
请注意,执行lst = []
并不会清空列表,只是创建一个新对象并将其绑定到变量lst
,但旧列表仍将具有相同的元素,并且如果它有其他变量绑定,则效果将显现。
clear()
list
。alist.clear() # removes all items from alist (equivalent to del alist[:])
根据链接的文档页面,也可以使用alist *= 0
来实现清空列表。
总而言之,有四种等效的方法可以原地清空列表(与Python之禅相反!):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
alist = []
? - mitenkaalist
,而这个列表恰好是空的。如果有其他人引用了原始列表,那么它仍然保持不变(即它包含了一开始它所包含的内容)。 - Adam Batkinalist.clear()
或 alist[:] = []
有助于检查 alist
是否真的是一个列表。假设你从函数 foo()
中返回了 alist
。你认为 foo
返回了一个列表,但实际上它返回了 None
。使用 alist = []
无法捕捉到这个错误。 - aafulei事实证明,在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
.clear()
,del b[:]
和b[:]=[]
都运行相同(b[:]=[]
略慢一些)。 - Conchylicultorlst *= 0
具有相同的效果
lst[:] = []
这个比较简单,也许更容易记住。除此之外,没有什么好说的。
效率似乎差不多。
list = []
将重置list
为一个空列表。
请注意,通常不应该遮蔽保留的函数名称,例如list
,它是列表对象的构造函数 - 您可以使用lst
或list_
代替。
另一个你可以使用的简单代码(根据你的情况而定)是:
index=len(list)-1
while index>=0:
del list[index]
index-=1
你必须从列表长度开始倒序索引,而不是从0开始正序索引,因为这样会导致索引等于列表长度且仅被切成一半。
此外,请确保 while 行具有“大于或等于”符号。省略它会使 list[0] 保留下来。