添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
小猫猫  ·  python tornado ...·  2 月前    · 
有腹肌的充值卡  ·  pycharm console 清屏 ...·  1 月前    · 
正直的棒棒糖  ·  dotnet publish 命令 - ...·  1 年前    · 
谈吐大方的甘蔗  ·  Alpine Linux ...·  1 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams pop can pop items out from anywhere in a list. append cannot "push" something into the middle of a list. endolith Aug 28, 2014 at 0:30

Because "append" existed long before "pop" was thought of. Python 0.9.1 supported list.append in early 1991. By comparison, here's part of a discussion on comp.lang.python about adding pop in 1997. Guido wrote:

To implement a stack, one would need to add a list.pop() primitive (and no, I'm not against this particular one on the basis of any principle). list.push() could be added for symmetry with list.pop() but I'm not a big fan of multiple names for the same operation -- sooner or later you're going to read code that uses the other one, so you need to learn both, which is more cognitive load.

You can also see he discusses the idea of if push/pop/put/pull should be at element [0] or after element [-1] where he posts a reference to Icon's list:

I stil think that all this is best left out of the list object implementation -- if you need a stack, or a queue, with particular semantics, write a little class that uses a lists

In other words, for stacks implemented directly as Python lists, which already supports fast append(), and del list[-1], it makes sense that list.pop() work by default on the last element. Even if other languages do it differently.

Implicit here is that most people need to append to a list, but many fewer have occasion to treat lists as stacks, which is why list.append came in so much earlier.

@poige you're going to *read* code that uses the other one (...) which is more cognitive load Remembering "there's no push" only introduces cognitive load when you're writing code. Remembering "push is an exact synonym for append" introduces cognitive load whenever you read the one you see used less often. See stackoverflow.com/questions/3455488/… for more about why people think readability often trumps writeability stevenjackson121 Oct 1, 2016 at 3:51 3455488 is 404 ... not sure whether that reflects more on s/o policies than that argument though...? Ed Randall Dec 15, 2020 at 8:53 @EdRandall this question is archived here: web.archive.org/web/20170422054706/https://stackoverflow.com/… Karol Zlot Aug 3, 2021 at 11:22

Because it appends; it doesn't push. "Appending" adds to the end of a list, "pushing" adds to the front.

Think of a queue vs. a stack.

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

Edit: To reword my second sentence more exactly, "Appending" very clearly implies adding something to the end of a list, regardless of the underlying implementation. Where a new element gets added when it's "pushed" is less clear. Pushing onto a stack is putting something on "top," but where it actually goes in the underlying data structure completely depends on implementation. On the other hand, pushing onto a queue implies adding it to the end.

The tutorial seems to suggest that it simply pushes and pops from the end: "The list methods make it very easy to use a list as a stack, where the last element added is the first element retrieved (“last-in, first-out”). To add an item to the top of the stack, use append(). To retrieve an item from the top of the stack, use pop() without an explicit index. " Uri Oct 14, 2009 at 13:39 "pushing" in no way means adding to the front. every implementation of a stack that has ever been written by a sane person "pushes" onto the top (end) of the stack, not the bottom (start) of the stack Kip Oct 14, 2009 at 13:42 correction: every *array-based implementation. a linked-list implementation would push to the head. Kip Oct 14, 2009 at 13:47 No, having into account list.pop semantics, list.append pushes elements into the list, when viewed as a stack. fortran Oct 14, 2009 at 13:52 @JasonBaker You can implement a stack using a list, but that doesn't mean list==stack. You could also implement a stack using a queue, if you really wanted. (It would be horribly inefficient, but it's possible!) Mark E. Haase Sep 21, 2013 at 20:54 The confusion really comes from the fact that a stack doesn't have a "beginning" or "end" like a list, but rather a "top" and a "bottom". Adding to the stack implies placing an element on the top and "pushing" down. "Pushing" at the front makes no sense (at least not linguistically). And just to make things even more confusing, C++ uses "push_front" and "push_back". JesperE Sep 23, 2013 at 9:09 This doesn't make sense since there's a pop operation. Since push and pop are typically stack operations and go together, it should be expected that they operate on the same end of the list. jamesdlin Apr 2, 2013 at 19:20

Not an official answer by any means (just a guess based on using the language), but Python allows you to use lists as stacks (e.g., section 5.1.1 of the tutorial ). However, a list is still first of all a list, so the operations that are common to both use list terms (i.e., append) rather than stack terms (i.e., push). Since a pop operation isn't that common in lists (though 'removeLast' could have been used), they defined a pop() but not a push().

FYI, it's not terribly difficult to make a list that has a push method:

>>> class StackList(list):
...     def push(self, item):
...             self.append(item)
>>> x = StackList([1,2,3])
[1, 2, 3]
>>> x.push(4)
[1, 2, 3, 4]

A stack is a somewhat abstract datatype. The idea of "pushing" and "popping" are largely independent of how the stack is actually implemented. For example, you could theoretically implement a stack like this (although I don't know why you would):

l = [1,2,3]
l.insert(0, 1)
l.pop(0)

...and I haven't gotten into using linked lists to implement a stack.

No need to make it complicated: class StackList(type([])): push = StackList.append will be enough to define your class. – kriss Jul 9, 2021 at 13:13 Since you brought it up, if arrays have an .append() function, then why is there no corresponding.prepend() function? I can learn to use .insert(0,val) to prepend, but am then embarrassed by the lack of a corresponding .delete(pos,val) function. ref: docs.python.org/2/library/array.html – MarkHu Dec 5, 2012 at 18:32

Push is a defined stack behaviour; if you pushed A on to stack (B,C,D) you would get (A,B,C,D).

If you used python append, the resulting dataset would look like (B,C,D,A)

Edit: Wow, holy pedantry.

I would assume that it would be clear from my example which part of the list is the top, and which part is the bottom. Assuming that most of us here read from left to right, the first element of any list is always going to be on the left.

read the page you link to. push is defined as pushing onto the top of the stack. which end is the "top" depends on the implementation. in an array-based stack, push would push onto the end of the array. in a linked-list-based stack, push would push to the beginning. – Kip Oct 14, 2009 at 13:52

From PEP 20 -- The Zen of Python:

There should be one-- and preferably only one --obvious way to do it.

Having both list.append and list.push would be two ways of doing the same thing -- and list.append came first.

The second part is a good answer. But what does that have to do with being implemented in C/C++? – Jason Baker Oct 14, 2009 at 13:58 @Jason: In C++'s STL, push_back() is how you append to a list. I was trying to convey the meta-idea that the idea that lists are formed by pushing is perhaps more likely to pop up if you're working in C++. Make any sense? – unwind Oct 14, 2009 at 14:58 If you have a list type implemented as a contiguous array (a vector in C++, a list in Python, an array in Perl) then it makes sense to have "push" put the new element at the end. You'll please note that perl 4 supposed "push" and "pop" as functions on arrays exactly like Python's append/pop and C++'s push_back/pop_back, and well before STL was formally proposed to C++. So it has nothing to do with C++'s STL creating a new understanding of things. – Andrew Dalke Oct 14, 2009 at 21:23 One of the things I miss learning Python from a Perl background is the ability to use built-in push(), pop(), shift(), and unshift() operations to add/remove elements to/from either end of the same array. Even though I can easily wrap a Python list in a "Stackish" class or a "Queueish" class, it doesn't look so easy (or efficient) to do both at once. – Peter Mar 24, 2010 at 22:32

Push and Pop make sense in terms of the metaphor of a stack of plates or trays in a cafeteria or buffet, specifically the ones in type of holder that has a spring underneath so the top plate is (more or less... in theory) in the same place no matter how many plates are under it.

If you remove a tray, the weight on the spring is a little less and the stack "pops" up a little, if you put the plate back, it "push"es the stack down. So if you think about the list as a stack and the last element as being on top, then you shouldn't have much confusion.

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.