为什么Python中没有list.clear()方法?

40 投票
4 回答
26431 浏览
提问于 2025-04-15 14:12

这个问题受到了这个问题的启发。

为什么在Python里没有list.clear()这个方法呢?我发现这里有几个问题提到,正确的做法是用以下几种方式,但没有人解释为什么不直接提供一个方法来清空列表。

del lst[:]
lst[:] = []

虽然在Python的“哲学”里,通常不提倡有太多做事的方法,但我觉得有一个“list.clear()”方法其实更直观。而且,这样也和字典(dict)和集合(set)一致,它们都有.clear()这个方法。

我看到了一些关于这个问题的讨论,发在python-dev和python-ideas上,但没有得到明确的答案(可以查看这里(2006年)和这里(2009年))。Guido对此有发表过看法吗?这是不是一个在过去4-5年里还没有解决的争论点呢?

更新:list.clear()在Python 3.3中被添加了 - 查看这里

4 个回答

7

我不能回答为什么,但肯定应该有一个原因,这样不同类型的对象就可以用同样的方式来清空。

这里有一个明显且简单的例子:

def process_and_clear_requests(reqs):
    for r in reqs:
        do_req(r)
    reqs.clear()

这只需要对象支持迭代,并且支持 clear() 方法。如果列表也有 clear() 方法,那么这个方法就可以同时接受列表和集合。可是,由于集合和列表在删除内容时使用的方式不同,所以这样就行不通了;你最终会得到一些不太好看的解决办法,比如:

def process_and_clear_requests(reqs):
    for r in reqs:
        do_req(r)
    if getattr(reqs, "clear"):
        reqs.clear()
    else:
        del reqs[:]

在我看来,使用 del obj[:] 或者 obj[:] = [] 只是为了绕过列表缺少 clear() 方法而产生的不太好用、不直观的解决方案。

这就像是为了“减少冗余”而走入了一个误区,损害了语言的一致性,而一致性其实更重要。

至于你应该使用哪个,我建议用 del obj[:]。因为我觉得对于那些不像列表的对象来说,这样实现会更简单。

15

在这个问题被提出来的时候,list.clear() 这个方法还不存在,但在3.3版本中已经添加了这个方法(这是根据http://bugs.python.org/issue10516的请求)。此外,bytearrayMutableSequence 也新增了 clear() 方法,这样在列表和其他集合(比如集合、字典等)之间切换会更方便。

关于这个变化的详细信息可以在这里找到。

18

在你提到的那些讨论中,Raymond Hettinger 大致总结了添加这个方法的优缺点。在设计编程语言的时候,保持谨慎是非常重要的。比如,C#团队有一个原则叫做“每个功能开始时都是-100分”。如果随便添加功能,就无法做到像Python那样简洁。你可以看看一些比较复杂的流行脚本语言,看看这样做会导致什么结果。

我想.clear()这个方法可能从来没有突破过那个隐含的-100分规则,所以没有成为核心语言中值得添加的功能。虽然这个方法名已经用于类似的目的,而且找到替代方案可能比较困难,但它离被接受也许并不远。

撰写回答