为什么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
答案 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
[]