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

job*_*job 39 python list clear

灵感来自这个问题.

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

del lst[:]
lst[:] = []
Run Code Online (Sandbox Code Playgroud)

虽然它可能违背了"蟒蛇的禅",但有一种以上的做法,对我来说,使用"list.clear()"方法似乎更为明显.它也会与dicts和sets一致,两者都有.clear().

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

更新: list.clear()已添加到3.3中的python中 - 请参见此处

Ant*_*sma 18

在链接Raymond Hettinger的线程中,总结了添加该方法的优缺点.谈到语言设计,保守是非常重要的.例如,参见C#团队的"每个功能以-100点开头"的原则.通过添加功能,你不会得到像Python一样干净的东西.只需看看一些更流行的流行脚本语言,看看它在哪里.

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

  • 请注意,这已经"越过了-100点规则",并且在Python 3.3中添加了`list.clear()` - 请参阅[@ Jacek的回答](http://stackoverflow.com/a/6675045/68707) . (18认同)

Jac*_*eka 14

虽然没有list.clear()问这个问题,3.3现在有一个(根据http://bugs.python.org/issue10516的要求).此外,clear()还添加了一些方法bytearray,MutableSequence以便于在列表和其他集合(set,dict等)之间进行切换.

有关变更的详细信息,请点击此处.


Gle*_*ard 7

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

一个明显,简单的例子:

def process_and_clear_requests(reqs):
    for r in reqs:
        do_req(r)
    reqs.clear()
Run Code Online (Sandbox Code Playgroud)

这只需要对象支持迭代,并且它支持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[:]
Run Code Online (Sandbox Code Playgroud)

就我而言,使用del obj [:]或obj [:] = []只是令人不愉快,不直观的黑客可以解决列表缺少clear()这一事实.

这会将"减少冗余"转变为故障,从而损害语言的一致性,这一点更为重要.

至于你应该使用哪个,我建议del obj [:].我认为对非类似列表的对象实现起来更容易.