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

2024-05-18 23:44:01 发布

您现在位置:Python中文网/ 问答频道 /正文

灵感来自this question.

为什么python中没有list.clear()方法?我在这里发现了几个问题,说正确的方法是下面的其中一个,但是没有人说为什么没有一个方法可以解决这个问题。

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

虽然有不止一种方法做某事可能违背了“python之禅”,但对我来说,有一个“list.clear()”方法显然更为明显。它也将符合dict和set,它们都有.clear()。

我看到一些关于python开发和python思想的帖子,但没有得到明确的答案(参见here(2006)和here(2009))。圭多参与了吗?这只是过去4-5年来还没有解决的争论点吗?

更新:list.clear()已在3.3-see here中添加到python中


Tags: 方法答案herethisdict帖子list思想
3条回答

在您链接的线程中添加该方法的Raymond Hettinger pretty much sums up the pros and cons。说到语言设计,保守是很重要的。例如,请参见C团队拥有的"every feature starts with -100 points"原则。通过随意添加特性,您不会得到像Python那样干净的东西。只需看看一些更为粗俗的流行脚本语言,就可以知道它会把你带到哪里。

我想.clear()方法从来没有越过隐式-100点规则,成为值得添加到核心语言中的东西。尽管methodname已经被用于相同的目的,而且很难找到替代方法,但它可能并没有那么远。

虽然在问这个问题时没有list.clear(),但3.3现在有了一个(如http://bugs.python.org/issue10516中所要求的)。此外,clear()方法被添加到^{}^{}中,以简化列表和其他集合(set、dict等)之间的切换。

有关更改的详细信息,请参见here

我无法回答原因;但绝对应该有一个,这样就可以用同一个接口清除不同类型的对象。

一个显而易见的简单例子:

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

这只需要对象支持迭代,并且它支持clear()。如果lists有一个clear()方法,那么它可以接受一个list或设置相等的值。相反,由于集合和列表有不同的API来删除它们的内容,这是行不通的;您最终会遇到一个不必要的丑陋的黑客攻击,比如:

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[:]。我认为对于非列表类对象更容易实现。

相关问题 更多 >

    热门问题