代码之家  ›  专栏  ›  技术社区  ›  Gordon Wrigley

在python中添加append-update和extend

  •  3
  • Gordon Wrigley  · 技术社区  · 14 年前

    在我们迭代开发时,经常需要在这些之间进行转换。随着时间的推移,随着程序结构的变化,各种结构会获得和失去诸如排序和复制之类的需求。

    所有这些更改都需要查找和更改添加/附加和扩展/更新相关结构的所有位置。

    所以,我很想看到最初的讨论,导致了这种语言的选择,不幸的是,我没有幸在谷歌上找到它。

    3 回复  |  直到 14 年前
        1
  •  5
  •   Alex Martelli    14 年前

    append 有一个流行的定义“添加到最后”,和 extend 可以类似地理解(在细微差别中,它的意思是“……超出某个点”);集合没有“结束”,也没有任何方式来指定它们内部的某个“点”或“在它们的边界”(因为没有“边界”!)因此,如果认为可以进行这些操作,那将是高度误导性的。

    x.append(y) 总是增加 len(x) y 已在列表中 x s.add(z) ( s 的长度可能会增加 是的 可以拥有 任何 value(也就是说,append操作永远不会失败[除了内存耗尽的异常情况])——同样没有这样的断言 z (必须是散列的,否则add操作将失败并引发异常)。类似的差异适用于 延伸 update . 对于语义迥异的操作使用相同的名称 非常 确实是误导。

    仅仅使用一个列表似乎有点像蟒蛇 在第一次传球的时候 在以后的迭代中的性能

    表演是最不重要的! list 支持重复项、订购和 项目类型-- set s保证项目的唯一性,没有顺序的概念,并且要求项目的哈希性。用一个列表(加上愚蠢的重复检查等等)来代表一个集合——无论是否表现,“说出你的意思!”是蟒蛇的方式;-)。(在Fortran或C等语言中,作为内置容器类型得到的都是数组,如果需要避免使用附加程序库,则可能必须执行这种“心理映射”;在Python中,没有这种需要)。

    discoverduplicates在那里很糟糕(而且,我要补充的是:顺序无关紧要,项是可散列的,不需要索引/切片,等等)。如果Python的 s对上述两种方法有“同义词”:

    class somewhatlistlikeset(set):
        def append(self, x): self.add(x)
        def extend(self, x): self.update(x)
    

    当然,如果唯一的改变是在创建集合时(过去是创建列表),那么代码可能会更具挑战性,因为它失去了使用的有用的清晰性 add 允许任何阅读代码的人“本地”知道对象是集合还是列表。。。但这也是上述“完全相同效果”的一部分!-)

        2
  •  3
  •   Chris B.    14 年前

    set dict

        3
  •  1
  •   Chris B.    14 年前

    这样写是为了惹恼你。

    不能 简单地把一个简单地转换成另一个。历史上, set dict s、 所以这两个共享命名约定。你可以很容易地写一个

    class ListlikeSet(set):
        def append(self, x):
            self.add(x)
    
        def extend(self, xs):
            self.update(xs)
    

    ... 更大的问题是为什么你发现自己在皈依 list s到 如此规律。它们代表了一组对象的本质上不同的模型;如果必须在这两种模型之间进行大量转换,则说明您可能无法很好地处理程序的概念架构。