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

311 投票
12 回答
292613 浏览
提问于 2025-04-15 15:03

有没有人知道为什么Python里用的list.append这个方法不叫list.push呢?因为已经有一个list.pop的方法可以删除并返回最后一个元素(这个元素的索引是-1),而且list.append的意思和这个用法是很一致的。

12 个回答

11

因为它是把一个元素加到列表里吗?“推送”(Push)这个词通常用在说栈的时候。

15

因为它是“添加”,而不是“推入”。“添加”是把东西放到列表的末尾,而“推入”是把东西放到最前面。

可以想象一下队列和栈的区别。

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

补充:为了更准确地表达我的第二句话,“添加”很明显是指把东西放到列表的末尾,不管底层是怎么实现的。而“推入”时新元素放在哪里就不太明确了。推入栈是把东西放在“顶部”,但它在底层数据结构中的具体位置完全取决于实现方式。另一方面,推入队列则意味着把东西放到末尾。

286

因为“append”(添加)这个功能在“pop”(弹出)被想到之前就已经存在了。早在1991年初,Python 0.9.1就支持了list.append这个功能。相比之下,这里有一段关于在1997年讨论添加pop功能的内容。Guido写道:

要实现一个栈,你需要添加一个list.pop()的功能(而且,我并不是因为任何原则反对这个功能)。为了和list.pop()保持对称,可以添加list.push(),但我并不喜欢同一个操作有多个名字——迟早你会看到使用另一个名字的代码,所以你需要学习两个,这样会增加认知负担。

你还可以看到他讨论了push/pop/put/pull这些操作应该是在第一个元素[0]上还是在最后一个元素[-1]后面,并提到了Icon语言的列表:

我仍然认为这些最好不要放在列表对象的实现中——如果你需要一个栈或者队列,并且有特定的语义,可以写一个小类来使用列表。

换句话说,对于直接用Python列表实现的栈,列表本身已经支持快速的append()和del list[-1],所以list.pop()默认操作最后一个元素是合理的。即使其他语言的做法不同。

这里隐含的意思是,大多数人需要向列表中添加元素,但很少有人会把列表当作栈来用,这就是为什么list.append出现得这么早的原因。

撰写回答