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

Edd*_*ker 247 python

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

And*_*lke 231

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

要实现一个堆栈,需要添加一个list.pop()原语(不,我不会在任何原则的基础上反对这个特定的).可以使用list.pop()添加list.push()以保持对称性,但我不是同一操作的多个名称的忠实粉丝 - 迟早你会读取使用另一个的代码,所以你需要学习两者,这是更多的认知负荷.

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

我仍然认为所有这些最好不在列表对象实现中 - 如果你需要一个具有特定语义的堆栈或队列,写一个使用列表的小类

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

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

  • @poige`你要*读*代码使用另一个(...)更多的认知负荷`记住"没有推动"只会在你编写代码时引入认知负荷.记住"推送是追加的确切同义词"会在您阅读不经常使用的那个时引入认知负荷.请参阅http://stackoverflow.com/questions/3455488/code-is-read-more-than-it-is-written,了解更多关于为什么人们认为可读性经常胜过可写性的原因 (10认同)
  • 没有任何借口/感觉 (2认同)

Mat*_*all 15

因为它附加; 它没有推动."追加"增加了一个列表的末尾,"推动"增加了前面.

想想一个队列与一个堆栈.

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

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

  • "推"绝不意味着增加前线.一个由理智的人写过的堆栈的每个实现都"推"到堆栈的顶部(末端),而不是堆栈的底部(开始) (102认同)
  • javascript`push`添加到最后. (14认同)
  • 该教程似乎表明它只是从末尾推送和弹出:"列表方法使得将列表用作堆栈非常容易,其中添加的最后一个元素是检索到的第一个元素("后进先出" ").要将项添加到堆栈顶部,请使用append().要从堆栈顶部检索项目,请使用不带显式索引的pop()." (4认同)
  • *更正:每个*基于数组的*实现.链接列表的实现将推向头脑. (4认同)
  • 不,考虑到`list.pop`语义,`list.append`在被视为堆栈时将元素推送到列表中. (2认同)

Jes*_*erE 10

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

  • 列表可以是堆栈.:-) (7认同)

Gyo*_*yom 9

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

  • 这是没有意义的,因为有一个'pop`操作.由于`push`和`pop`通常是堆栈操作并且一起使用,因此应该预期它们在列表的同一端操作. (10认同)

Uri*_*Uri 7

无论如何都不是官方答案(只是基于使用语言的猜测),但Python允许您将列表用作堆栈(例如,本教程的第5.1.1节).但是,列表仍然首先是列表,因此两者共用的操作都使用列表术语(即追加)而不是堆栈术语(即推送).由于弹出操作在列表中并不常见(尽管可能已经使用了"removeLast"),因此他们定义了pop()而不是push().