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

时间:2009-09-09 20:34:42

标签: python list clear

this question.启发

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

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

虽然有可能违背“蟒蛇的禅”而不止一种方式做某事,但对我来说,使用“list.clear()”方法似乎更为明显。它也会与dicts和sets一致,两者都有.clear()。

我遇到了一些关于python-dev和python-ideas的帖子,并没有得出明确的答案(参见here(2006)和here(2009))。 Guido有没有权衡呢?在过去的4 - 5年里,它只是一个尚未解决的争论点吗?

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

5 个答案:

答案 0 :(得分:18)

在您添加该方法的Raymond Hettinger pretty much sums up the pros and cons链接的主题中。谈到语言设计,保守是非常重要的。例如,参见C#团队的"every feature starts with -100 points"原则。通过添加功能,你不会得到像Python一样干净的东西。只需看看一些更流行的流行脚本语言,看看它的用途。

我认为.clear()方法从未跨过隐含的-100点规则,成为值得添加到核心语言的东西。虽然方法名已被用于同等目的,并且替代方案很难找到,但它可能并不是那么远。

答案 1 :(得分:14)

虽然在提出此问题时没有list.clear(),但3.3现在有一个(根据http://bugs.python.org/issue10516的要求)。此外,clear()bytearray添加了{{1}}方法,以便于在列表和其他集合(set,dict等)之间切换。

可以找到更改的完整详细信息MutableSequence

答案 2 :(得分:7)

我无法回答原因;但绝对应该有一个,所以可以使用相同的界面清除不同类型的对象。

一个明显,简单的例子:

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

这只需要对象支持迭代,并且它支持clear()。如果列表具有clear()方法,则可以接受列表或设置相同。相反,由于集合和列表具有用于删除其内容的不同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 [:]。我认为对非类似列表的对象实现起来更容易。

答案 3 :(得分:0)

在测试时,在全局变量中设置构成测试域的数据通常很有用,这样,如果必要/更简单,测试可以相互构建。 在这种情况下,使用清除列表的方法可以让您无需在函数(即测试)中将这些变量声明为全局变量。 我知道,测试不应该依赖于彼此......

答案 4 :(得分:-9)

问题应该是为什么clear首先被认为是必要的。以下工作可以清除我能想到的任何Python集合。

def clear(x):
    return type(x)()

>>> s = {1, 2, 3}
>>> s
set([1, 2, 3])
>>> s = clear(s)
>>> s
set([])
>>> l = [1, 2, 3]
>>> l
[1, 2, 3]
>>> l = clear(l)
>>> l
[]