Python 如何清空列表?

Python 如何清空列表?,python,list,Python,List,以这种方式清空列表似乎很“脏”: while len(alist) > 0 : alist.pop() 有没有明确的方法可以做到这一点 list = [] 将列表重置为空列表 请注意,通常不应对保留的函数名进行阴影处理,如列表对象的构造函数list——例如,您可以使用lst或list\uu。这实际上会从列表中删除内容,但不会用新的空列表替换旧标签: del lst[:] 下面是一个例子: lst1 = [1, 2, 3] lst2 = lst1 del lst1[:] print(l

以这种方式清空列表似乎很“脏”:

while len(alist) > 0 : alist.pop()
有没有明确的方法可以做到这一点

list = []
列表
重置为空列表


请注意,通常不应对保留的函数名进行阴影处理,如列表对象的构造函数
list
——例如,您可以使用
lst
list\uu

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

del lst[:]
下面是一个例子:

lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)
为了完整性起见,切片分配具有相同的效果:

lst[:] = []
它还可以用于在替换部分的同时收缩列表的一部分(但这超出了问题的范围)

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

您可以尝试:

alist[:] = []
这意味着:在位置
[:]
(从开始到结束的所有索引)的列表中拼接
[]
(0个元素)


[:]是切片操作符。有关更多信息,请参见。

事实证明,在python 2.5.2中,
dell[:]
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

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

你必须从列表的长度开始索引,然后向后,而不是从0开始索引,向前,因为这样做会使你的索引等于列表的长度,只会被减半


此外,请确保while行具有“大于或等于”符号。省略它将留下列表[0]。

如果您运行的是Python 3.3或更高版本,您可以使用
list
的方法,该方法与
dict
clear()
set
deque
和其他可变容器类型并行:

alist.clear()  # removes all items from alist (equivalent to del alist[:])
根据链接的文档页面,同样可以通过
alist*=0
实现

总而言之,有四种等效的方法可以清除已准备好的列表(与此相反!):

  • alist.clear()#Python 3.3+
  • del-alist[:]
  • alist[:]=[]
  • alist*=0
  • 具有与相同的效果

    lst[:] = []
    
    它有点简单,也许更容易记住。除此之外,没什么好说的



    效率似乎大致相同

    否:这不会修改列表,只是将空列表分配给变量
    list
    。如果您希望函数修改传入的列表(例如),那么这并不能满足您的要求。事实并非如此。问题是“如何清空列表”而不是“如何为包含列表的变量赋值”问题并不含糊,op的代码段从列表中弹出元素(就是这样,在适当的位置修改它)……此外,“列表”不应该用作变量名,因为它是“列表”类型。许多Python开发人员使用“L”作为列表变量名,但我更喜欢“lst”。有时您只希望列表为空,这与所提出的任何方法一样好。可能更快的还有另外两个问题:“del”到底是什么?(我推断它是del etes,但我真的不知道它是什么)和第二:如何(大声地)阅读[:]对于del的合理解释,我会参考文档:我通常不会大声地阅读python代码xD,但如果我不得不这样做,我想我会说“从列表的开始到结尾切片l”.@jellybean完全无意的^ ^英语不是我的母语,所以我真的没有注意到这两个注释之间的对比。如果我们使用l=[],旧列表内容不会被Python GC垃圾收集吗?那么为什么Python dicts和set有clear()方法,而不是list?但是如果有多个对象引用,这可能很有用。如果我需要在运行时清除进程上的共享列表,而不需要等待垃圾收集(或者我错了吗?我误解了垃圾收集吗?)。另外,如果我想检查每个弹出的元素,我可以调试它,而我不能使用切片(或者我错了)。我不需要在清除列表时停止进程执行。@S.Lott仅仅因为你不理解为什么这很重要并不意味着我们其他人不理解。如果多个对象依赖于一个公共列表,这将很重要。在一些设计模式中,这一点很重要。垃圾收集器意味着你不必自己清理垃圾;尽管有其他更好的答案,您的初始代码还是可以编写的:而Python 2.7.2中的alist:alist.pop()在我的机器上,它们大致相同。它们都在每个循环13.5-13.7 usec的范围内运行。您还应该测量python3-mtimeit“l=list(范围(1000))”“b=l[:]”来计算“b[:]=[]”和“del b[:]”。我用Python3.5做了基准测试,我同意leetNightshade
    .clear()
    delb[:]
    b[:]=[]
    都运行相同的(
    b[:]=[]
    稍微慢一点。用立方体重新发明轮子哈。这是我在这方面遇到的第二个奇怪的答案(+一个适当的注释)。应该有一个网站来记录这些难忘的事情:DWhy不仅仅是
    alist=[]
    ?@mitenka如果不清空列表,它会用另一个恰好为空的列表覆盖变量
    alist
    。如果其他任何人引用了原始列表,该列表将保持原样(即它包含列表中的任何内容)@mitenka另一个原因是
    alist.clear()
    alist[:]=[]
    有助于检查
    alist
    是否确实是一个列表。假设您从函数
    foo()
    返回了
    alist
    。您认为
    foo
    返回了一个列表,但它确实返回了一个
    None
    。使用
    alist=[]
    无法发现这个错误。我遇到了这篇博文
    lst *= 0
    
    lst[:] = []