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

受这个问题的启发。

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

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

虽然这可能违背了“python之禅”有不止一种做法,但对我来说,有一个“list.clear()”方法当然更为明显。 它也符合指令和集合,两者都有.clear()。

我偶然发现了一些有关python-dev和python的文章,并没有给出明确的答案(参见这里 (2006)和here (2009))。 Guido有权衡吗? 这只是一个争论点,在过去的4-5年里还没有解决吗?

更新: list.clear()被添加到3.3的Python中 – 请参阅此处

在你连接的线索里, Raymond Hettinger总结了添加该方法的优点和缺点 。 谈到语言devise,保守一点非常重要。 例如,请参阅C#团队的“每个function都以-100分开始”原则。 通过添加function,你不会像Python那样干净。 只要看看一些比较笨拙的stream行脚本语言,看看它需要你。

我猜测.clear()方法从来没有跨越隐式的-100点规则成为值得添加到核心语言的东西。 虽然考虑到methodname已经被用于相同的目的,而且可能很难find,但可能并不是那么远。

虽然在问这个问题时没有list.clear() ,3.3现在有一个(请list.clear() http://bugs.python.org/issue10516 )。 此外, clear()方法已经添加到bytearrayMutableSequence以便轻松切换列表和其他集合(set,dict等)。

更改的全部细节可以在这里find。

我不能回答这个问题。 但绝对应该有一个,所以不同types的对象可以用相同的接口清除。

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

 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 [:] = []只是令人不愉快的,不直观的黑客来解决清单缺lessclear()的事实。

这是“减less冗余”的一个错误,它损害了语言的一致性 ,这更加重要。

至于你应该使用,我build议del obj [:]。 我认为对于非列表对象来说更容易实现。

在进行testing时,在全局variables中设置构成testing领域的数据通常是有用的,这样如果必要/简单的话,testing可以彼此build立。 在这种情况下,有一个清除列表的方法可以让你做到这一点,而不需要在一个函数(即testing)中声明这些variables是全局的。 我知道,testing不应该依赖于…

这个问题应该是为什么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 []