为什么python列表有pop()但没有push()

时间:2009-10-14 13:34:27

标签: python

有没有人知道为什么Python的list.append函数没有被调用list.push,因为已经有list.pop删除并返回最后一个元素(索引为-1)和{{1}语义与使用一致吗?

10 个答案:

答案 0 :(得分:229)

因为“追加”在“流行”之前很久就存在了。 Python 0.9.1在1991年初支持list.append。相比之下,这是关于在1997年添加pop的discussion on comp.lang.python的一部分.Guido写道:

  

要实现堆栈,需要   添加list.pop()原语(和   不,我不反对这一点   一个基于任何原则)。   可以添加list.push()   与list.pop()对称,但我不是   多个名字的忠实粉丝   同样的操作 - 迟早   你将阅读使用的代码   另一个,所以你需要学习   两者都是认知负荷。

您还可以看到他讨论了如果push / pop / put / pull应该在元素[0]或元素[-1]之后,他发布了对Icon列表的引用的想法:

  

我认为这一切都是最好的   从列表对象中删除   实现 - 如果你需要一个堆栈,   或特别是队列   语义,写一个小班   使用列表

换句话说,对于直接作为Python列表实现的堆栈,已经支持快速append()和del list [-1],有意义的是list.pop()默认工作在最后一个元素上。即使其他语言的表达方式不同。

这里隐含的是大多数人需要附加到列表中,但是更少的人有机会将列表视为堆栈,这就是为什么list.append更早出现的原因。

答案 1 :(得分:14)

因为它附加;它没有推动。 “附加”增加了一个列表的末尾,“推动”增加了前面。

考虑队列与堆栈。

http://docs.python.org/tutorial/datastructures.html

编辑:更准确地重写我的第二句话,“追加”非常清楚意味着在列表的 end 中添加内容,而不管底层实现如何。在“推送”时添加新元素的地方不太清楚。推入堆栈是将某些东西置于“顶部”,但实际上它在底层数据结构中的位置完全取决于实现。另一方面,推入队列意味着将其添加到最后。

答案 2 :(得分:10)

因为它将一个元素附加到列表中?推送通常在引用堆栈时使用。

答案 3 :(得分:9)

因为“追加”直观地意味着“在列表的末尾添加”。如果它被称为“推”,那么我们不清楚我们是在尾部还是在列表的顶部添加东西。

答案 4 :(得分:7)

不是任何官方答案(只是基于使用语言的猜测),但Python允许您将列表用作堆栈(例如,section 5.1.1 of the tutorial)。然而,列表仍然首先是列表,因此两者共同使用列表术语(即,追加)而不是堆栈术语(即推送)的操作。由于弹出操作在列表中并不常见(尽管可能已经使用了“removeLast”),因此他们定义了pop()而不是push()。

答案 5 :(得分:3)

好的,这里的个人观点,但附加和前置意味着在一组中的精确位置。

Push和Pop真的是可以应用于集合的任何一端的概念......只要你是一致的......出于某种原因,对我来说,Push()似乎应该适用于前面一套...

答案 6 :(得分:3)

仅供参考,制作具有推送方法的列表并不是非常困难:

>>> 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)

...我还没有使用链接列表来实现堆栈。

答案 7 :(得分:1)

推送是一种定义的stack行为;如果你把A推到堆叠(B,C,D),你会得到(A,B,C,D)。

如果你使用python append,结果数据集看起来像(B,C,D,A)

编辑:哇,神圣的迂腐。

我认为从我的例子中可以清楚地看到列表的哪一部分是顶部,哪部分是底部。假设我们这里的大多数人从左到右阅读,任何列表的第一个元素总是在左边。

答案 8 :(得分:0)

可能是因为Python的原始版本( C Python)是用C语言编写的,而不是用C ++编写的。

通过将事物推到事物背面而形成列表的想法可能并不像追加它们的想法那样众所周知。

答案 9 :(得分:-1)

Push and Pop在自助餐厅或自助餐中的一堆盘子或托盘的隐喻方面是有意义的,特别是那些在下面有弹簧的支架类型,所以顶板是(或多或少......在理论上)无论在它下面有多少块板,它们都在同一个地方。

如果你取下一个托盘,弹簧上的重量会稍微减少,并且堆叠“弹出”一点,如果你把盘子放回去,它会“推”掉堆叠。因此,如果您将列表视为堆栈而最后一个元素位于顶部,那么您不应该有太多的困惑。