有没有人知道为什么Python的 list.append 函数不被称为 list.push ,因为已经有 list.pop 删除并返回最后一个元素(索引为-1)和 list.append 语义与该用法一致?
list.append
list.push
list.pop
因为"append"早在"pop"之前就已经存在了 . Python 0.9.1支持list.append在1991年初 . 相比之下,这是discussion on comp.lang.python关于在1997年添加流行音乐的一部分.Guido写道:
要实现一个堆栈,需要添加一个list.pop()原语(不,我不会在任何原则的基础上反对这个特定的) . 可以使用list.pop()添加list.push()以保持对称性,但我不是同一操作的多个名称的忠实粉丝 - 迟早你会读取使用另一个的代码,所以你需要学习两者,这是更多的认知负荷 .
您还可以看到他讨论了如果push / pop / put / pull应该在元素[0]或元素[-1]之后,他发布了对Icon列表的引用的想法:
我仍然认为所有这些最好不在列表对象实现中 - 如果你需要一个具有特定语义的堆栈或队列,写一个使用列表的小类
换句话说,对于直接作为Python列表实现的堆栈,已经支持快速append()和del list [-1],有意义的是list.pop()默认在最后一个元素上工作 . 即使其他语言的表达方式不同 .
这里隐含的是大多数人需要附加到列表中,但是更少的人有机会将列表视为堆栈,这就是为什么list.append更早出现的原因 .
因为它附加;它没有推动 . “追加”增加了一个列表的末尾,“推动”增加了前面 .
想想一个队列与一个堆栈 .
http://docs.python.org/tutorial/datastructures.html
Edit: 为了更准确地改写我的第二句话,"Appending"非常清楚地意味着在列表的末尾添加一些内容,而不管底层实现如何 . 当一个新元素的"pushed"不太清楚时,会添加一个新元素 . 推入堆栈正在"top,"上,但实际上它在底层数据结构中的位置完全取决于实现 . 另一方面,推入队列意味着将其添加到最后 .
因为它将一个元素附加到列表中?在引用堆栈时通常使用推送 .
因为“追加”直观地意味着“在列表的末尾添加” . 如果它被称为“推”,那么我们不清楚我们是在尾部还是在列表的顶部添加东西 .
不是任何方式的官方答案(只是基于使用语言的猜测),但Python允许您将列表用作堆栈(例如,section 5.1.1 of the tutorial) . 然而,列表仍然首先是列表,因此两者共同使用列表术语(即,追加)而不是堆栈术语(即推送)的操作 . 由于弹出操作不是't that common in lists (though ' removeLast'可能已经被使用过),因此他们定义了一个pop()而不是一个push() .
好的,这里的个人观点,但Append和Prepend意味着一组中的精确位置 .
Push和Pop真的是可以应用于集合的任何一端的概念......只要你是一致的......出于某种原因,对我来说,Push()似乎应该适用于前面的组...
仅供参考,制作具有推送方法的列表并不是非常困难:
>>> class StackList(list): ... def push(self, item): ... self.append(item) ... >>> x = StackList([1,2,3]) >>> x [1, 2, 3] >>> x.push(4) >>> x [1, 2, 3, 4]
堆栈是一种有点抽象的数据类型 . “推”和“弹出”的想法很大程度上与堆栈实际实现的方式无关 . 例如,理论上你可以实现这样的堆栈(虽然我不知道你为什么会这样做):
l = [1,2,3] l.insert(0, 1) l.pop(0)
...而且我还没有使用链表来实现堆栈 .
推送是一种定义的stack行为;如果你把A推到堆栈(B,C,D),你会得到(A,B,C,D) .
如果你使用python append,结果数据集看起来像(B,C,D,A)
编辑:哇,神圣的迂腐 .
我会假设从我的例子中可以清楚地看到列表的哪一部分是顶部,哪部分是底部 . 假设我们这里的大多数人从左到右阅读,任何列表的第一个元素总是在左边 .
可能是因为Python的原始版本( C Python)是用C语言编写的,而不是C语言 .
通过将事物推到事物背面而形成列表的想法可能并不像追加它们的想法那样众所周知 .
Push和Pop在一堆盘子或托盘的隐喻方面有意义自助餐厅或自助餐厅,特别是那种在下方有 spring 的支架类型,所以顶板(或多或少......理论上)在同一个地方,无论它下面有多少个板 .
如果你取下一个托盘, spring 上的重量会稍微减少,并且堆叠“弹出”一点,如果你把盘子放回去,它会“推”掉堆叠 . 因此,如果您将列表视为堆栈而最后一个元素位于顶部,那么您不应该有太多的困惑 .
10 回答
因为"append"早在"pop"之前就已经存在了 . Python 0.9.1支持list.append在1991年初 . 相比之下,这是discussion on comp.lang.python关于在1997年添加流行音乐的一部分.Guido写道:
您还可以看到他讨论了如果push / pop / put / pull应该在元素[0]或元素[-1]之后,他发布了对Icon列表的引用的想法:
换句话说,对于直接作为Python列表实现的堆栈,已经支持快速append()和del list [-1],有意义的是list.pop()默认在最后一个元素上工作 . 即使其他语言的表达方式不同 .
这里隐含的是大多数人需要附加到列表中,但是更少的人有机会将列表视为堆栈,这就是为什么list.append更早出现的原因 .
因为它附加;它没有推动 . “追加”增加了一个列表的末尾,“推动”增加了前面 .
想想一个队列与一个堆栈 .
http://docs.python.org/tutorial/datastructures.html
Edit: 为了更准确地改写我的第二句话,"Appending"非常清楚地意味着在列表的末尾添加一些内容,而不管底层实现如何 . 当一个新元素的"pushed"不太清楚时,会添加一个新元素 . 推入堆栈正在"top,"上,但实际上它在底层数据结构中的位置完全取决于实现 . 另一方面,推入队列意味着将其添加到最后 .
因为它将一个元素附加到列表中?在引用堆栈时通常使用推送 .
因为“追加”直观地意味着“在列表的末尾添加” . 如果它被称为“推”,那么我们不清楚我们是在尾部还是在列表的顶部添加东西 .
不是任何方式的官方答案(只是基于使用语言的猜测),但Python允许您将列表用作堆栈(例如,section 5.1.1 of the tutorial) . 然而,列表仍然首先是列表,因此两者共同使用列表术语(即,追加)而不是堆栈术语(即推送)的操作 . 由于弹出操作不是't that common in lists (though ' removeLast'可能已经被使用过),因此他们定义了一个pop()而不是一个push() .
好的,这里的个人观点,但Append和Prepend意味着一组中的精确位置 .
Push和Pop真的是可以应用于集合的任何一端的概念......只要你是一致的......出于某种原因,对我来说,Push()似乎应该适用于前面的组...
仅供参考,制作具有推送方法的列表并不是非常困难:
堆栈是一种有点抽象的数据类型 . “推”和“弹出”的想法很大程度上与堆栈实际实现的方式无关 . 例如,理论上你可以实现这样的堆栈(虽然我不知道你为什么会这样做):
...而且我还没有使用链表来实现堆栈 .
推送是一种定义的stack行为;如果你把A推到堆栈(B,C,D),你会得到(A,B,C,D) .
如果你使用python append,结果数据集看起来像(B,C,D,A)
编辑:哇,神圣的迂腐 .
我会假设从我的例子中可以清楚地看到列表的哪一部分是顶部,哪部分是底部 . 假设我们这里的大多数人从左到右阅读,任何列表的第一个元素总是在左边 .
可能是因为Python的原始版本( C Python)是用C语言编写的,而不是C语言 .
通过将事物推到事物背面而形成列表的想法可能并不像追加它们的想法那样众所周知 .
Push和Pop在一堆盘子或托盘的隐喻方面有意义自助餐厅或自助餐厅,特别是那种在下方有 spring 的支架类型,所以顶板(或多或少......理论上)在同一个地方,无论它下面有多少个板 .
如果你取下一个托盘, spring 上的重量会稍微减少,并且堆叠“弹出”一点,如果你把盘子放回去,它会“推”掉堆叠 . 因此,如果您将列表视为堆栈而最后一个元素位于顶部,那么您不应该有太多的困惑 .