有谁知道为什么list.append不调用Python的函数list.push,因为已经有一个list.pop删除并返回最后一个元素(索引为-1)并且list.append语义与该用法一致的原因?
pop可以从列表中的任何位置弹出项目。 append不能将某些东西“推入”列表的中间。
有谁知道为什么list.append不调用Python的函数list.push,因为已经有一个list.pop删除并返回最后一个元素(索引为-1)并且list.append语义与该用法一致的原因?
pop可以从列表中的任何位置弹出项目。 append不能将某些东西“推入”列表的中间。
Answers:
因为“ append”早在想到“ pop”之前就已经存在。受Python 0.9.1支持的list.append于1991年初。通过比较,这是在comp.lang.python上讨论的有关在1997年添加pop 的一部分。Guido 写道:
为了实现一个堆栈,需要添加一个list.pop()原语(不,基于任何原则,我都不反对这种特定的堆栈)。可以添加list.push()使其与list.pop()对称,但是我不太喜欢针对同一操作使用多个名称-早晚要读取使用另一个名称的代码,所以您需要同时学习两者,这会增加认知负担。
您还可以看到他讨论了是否应该在元素[0]或元素[-1]之后或在元素[-1]之后发布推/弹出/放/拉的想法:他在其中发布了对Icon列表的引用:
我仍然认为最好将所有这些都排除在列表对象实现之外-如果您需要具有特定语义的堆栈或队列,请编写一个使用列表的小类
换句话说,对于直接实现为Python列表的堆栈,该堆栈已经支持快速的append()和del list [-1],默认情况下list.pop()在最后一个元素上起作用是有意义的。即使其他语言做了不同的处理。
这里的隐含含义是,大多数人都需要追加到列表,但是很少有人有机会将列表视为堆栈,这就是为什么list.append出现得这么早的原因。
you're going to *read* code that uses the other one (...) which is more cognitive load记住“没有推动力”只会在编写代码时引入认知负担。记住,“推式是append的确切同义词”会在每次阅读较少使用的单词时引入认知负荷。请参阅stackoverflow.com/questions/3455488/…了解更多有关为什么人们认为可读性通常胜过可写性的信息
因为它附加;它不会推动。“添加”添加到列表的末尾,“推”添加到列表的前部。
想一想队列还是堆栈。
http://docs.python.org/tutorial/datastructures.html
编辑:为了更准确地改写我的第二句话,“追加”非常清楚地意味着在列表的末尾添加一些内容,而不管其基础实现如何。当一个新元素被“推”到什么地方时,还不清楚。压入堆栈是将某些东西放在“顶部”,但是其在底层数据结构中的实际位置完全取决于实现。另一方面,推入队列意味着将其添加到末尾。
push添加到最后。
list.pop语义list.append,当将其视为堆栈时,会将元素推入列表。
因为它将元素添加到列表?推栈通常在引用堆栈时使用。
无论如何,这都不是正式的答案(只是基于使用该语言的猜测),但是Python允许您将列表用作堆栈(例如,本教程的5.1.1节)。但是,列表仍然是列表的第一位,因此,这两个共同的操作都使用列表项(即追加),而不是堆栈项(即推入)。由于弹出操作在列表中并不常见(尽管可以使用'removeLast'),所以他们定义了pop()而不是push()。
好的,这里有个人意见,但“追加”和“前置”表示集合中的精确位置。
Push和Pop确实是可以应用于集合两端的概念...只要您保持一致...出于某种原因,对我来说,Push()似乎应该应用于集合的前端组...
仅供参考,创建具有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)
...而且我还没有开始使用链表来实现堆栈。
可能是因为Python(C Python)的原始版本是用C而不是C ++编写的。
通过将事物推入事物的背面来形成列表的想法可能不如附加它们的想法众所周知。