代码之家  ›  专栏  ›  技术社区  ›  job

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

  •  39
  • job  · 技术社区  · 15 年前

    灵感来自 this question.

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

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

    虽然有不止一种方法可以与“python禅”相悖,但对于我来说,使用“list.clear()”方法显然更为明显。它还将与dict和set一致,两者都有.clear()。

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

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

    5 回复  |  直到 8 年前
        1
  •  18
  •   mgilson    8 年前

    在你链接的线程中 Raymond Hettinger pretty much sums up the pros and cons 添加该方法。在语言设计方面,保守是非常重要的。例如,请参见 "every feature starts with -100 points" C小组的原则。通过随意添加特性,您不会得到像python一样干净的东西。只需看看一些更为简略的流行脚本语言,看看它能为您带来什么。

    我猜 .clear() 方法只是从来没有通过隐式-100点规则成为一些值得添加到核心语言中的东西。尽管methodname已经用于一个等价的目的,而且很难找到替代方法,但它可能并不完全离它很远。

        2
  •  14
  •   Tharwen Jorge Israel Peña    12 年前

    当没有 list.clear() 当问到这个问题时,3.3现在有了一个(如中所要求的 http://bugs.python.org/issue10516 )。此外, clear() 方法已添加到 bytearray MutableSequence 以便于在列表和其他集合(set、dict等)之间切换。

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

        3
  •  7
  •   Glenn Maynard    15 年前

    我不能回答为什么;但绝对应该有一个,所以不同类型的对象可以用相同的接口清除。

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

    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[:]=[]只是不愉快的、非故意的黑客攻击,以绕过list is missing clear()这一事实。

    这将把“减少冗余”变成一个故障,它会损坏 一致性 语言,这更重要。

    至于您应该使用哪种,我建议您使用del obj[:]。我认为对于非列表类对象更容易实现。

        4
  •  0
  •   Pynchia    10 年前

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

        5
  •  -9
  •   Mark Ransom    12 年前

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