2009-10-14 12 views
222

¿Alguien sabe por qué la función list.append de Python no se llama list.push dado que ya hay un list.pop que elimina y devuelve el último elemento (que está indexado en -1) y la semántica list.append es coherente con ese uso?¿Por qué el "anexo" de Python no es "push"?

+20

Es un método, no una función.

+46

Creo que esta es una gran pregunta, aunque tal vez debería formularse: "¿Por qué las listas de Python tienen pop() pero no push()". – Uri

+5

'pop' puede sacar elementos de cualquier parte de una lista. 'append' no puede" empujar "algo en el medio de una lista. – endolith

Respuesta

212

Porque "append" existió mucho antes de que se pensara en "pop". Python 0.9.1 apoyaron list.append a principios de 1991. En comparación, esto es parte de un discussion on comp.lang.python sobre la adición de pop en 1997. Guido escribió:

para implementar una pila, sería necesario añadir un list.pop() primitiva (y no, no estoy en contra de este particular en base a ningún principio). list.push() podría agregarse para simetría con list.pop() pero no soy un gran fan de varios nombres para la misma operación - tarde o temprano va a leer el código que usa el otro, por lo que necesita aprender , que es más carga cognitiva.

También puede ver que discute la idea de si el empuje/pop/put/tracción deben estar en el elemento [0] o después del elemento [-1] donde se publica una referencia a la lista del icono:

Stil creo que todo esto es mejor quedan fuera del objeto de lista aplicación - si necesita una pila, o una cola, con especial semántica, escribir un poco de clase que utiliza un listas

En otras palabras, para las pilas implementadas directamente como listas de Python, que ya admite append rápido(), y del list [-1], tiene sentido que list.pop() funcione de forma predeterminada en el último elemento. Incluso si otros idiomas lo hacen de manera diferente.

Implícito aquí es que la mayoría de la gente necesita anexarse ​​a una lista, pero muchos menos tienen la oportunidad de tratar listas como stacks, razón por la cual list.append llegó mucho antes.

+15

Me gusta esta parte sobre "carga cognitiva". Así que ahora debes recordar que hay append(), y no hay push(). Sin carga en absoluto, ¿sí? – poige

+4

@poige 'vas a * leer * código que usa el otro (...) que es más carga cognitiva 'Recordar" no hay empuje "solo introduce carga cognitiva cuando estás escribiendo código. Recordar "push es un sinónimo exacto de append" introduce carga cognitiva cada vez que lee la que ve que se usa con menos frecuencia. Consulte http://stackoverflow.com/questions/3455488/code-is-read-more-thhan-it-is-written para obtener más información sobre por qué las personas piensan que la legibilidad a menudo supera la capacidad de escritura – stevenjackson121

+0

No hace ninguna excusa/sentido – poige

12

Porque se agrega; no empuja. "Agregar" se agrega al final de una lista, "empujar" se agrega al frente.

Piense en una cola frente a una pila.

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

Editar: reformular mi segunda frase, más exactamente, "Añadiendo" implica claramente añadiendo algo a la final de una lista, independientemente de la implementación subyacente. Dónde se agrega un nuevo elemento cuando se "empuja" es menos claro. Presionando sobre una pila está poniendo algo en "la parte superior", pero donde realmente va en la estructura de datos subyacente depende completamente de la implementación. Por otro lado, presionar una cola implica agregarla al final.

+4

El tutorial parece sugerir que simplemente presiona y aparece desde el final: "Los métodos de lista hacen que sea muy fácil usar una lista como una pila, donde el último elemento agregado es el primer elemento recuperado (" último en entrar, primero- out "). Para agregar un elemento a la parte superior de la pila, use append(). Para recuperar un elemento de la parte superior de la pila, use pop() sin un índice explícito." – Uri

+92

"presionar" de ninguna manera significa agregar al frente. cada implementación de una pila que alguna vez ha sido escrita por una persona cuerda "empuja" hacia la parte superior (final) de la pila, no hacia abajo (inicio) de la pila – Kip

+4

* corrección: cada implementación * basada en matriz *. una implementación de lista enlazada empujaría a la cabeza. – Kip

10

¿Porque agrega un elemento a una lista? El empuje se usa generalmente cuando se refiere a las pilas.

+6

Sin embargo, una lista puede ser una pila. :-) –

+0

@JasonBaker Puede implementar una pila usando una lista, pero eso no significa lista == pila. También podría implementar una pila usando una cola, si realmente quisiera. (¡Sería terriblemente ineficiente, pero es posible!) –

+0

La confusión realmente proviene del hecho de que una pila no tiene un "principio" o "final" como una lista, sino más bien una "parte superior" y una "parte inferior" . Agregar a la pila implica colocar un elemento en la parte superior y "empujar" hacia abajo. "Empujar" al frente no tiene sentido (al menos no lingüísticamente). Y solo para hacer las cosas aún más confusas, C++ usa "push_front" y "push_back". – JesperE

0

Probablemente porque la versión original de Python (C Python) se escribió en C, no en C++.

La idea de que una lista se forme presionando las cosas en la parte posterior de algo probablemente no sea tan conocida como la idea de anexarlas.

+0

La segunda parte es una buena respuesta. Pero, ¿qué tiene eso que ver con implementarse en C/C++? –

+0

@Jason: En STL de C++, push_back() es cómo se agrega a una lista. Intentaba transmitir la meta-idea de que la idea de que las listas están formadas presionando es tal vez más probable que aparezca si estás trabajando en C++. ¿Ningún sentido? – unwind

+0

Si tiene un tipo de lista implementado como una matriz contigua (un vector en C++, una lista en Python, una matriz en Perl), entonces tiene sentido que "push" coloque el nuevo elemento al final. Por favor, tenga en cuenta que perl 4 supuso "push" y "pop" como funciones en arreglos exactamente como Python's append/pop y C++ push_back/pop_back, y mucho antes de que STL fuera formalmente propuesto para C++. Por lo tanto, no tiene nada que ver con el STL de C++ que crea una nueva comprensión de las cosas. –

9

Porque "agregar" significa intuitivamente "agregar al final de la lista". Si se llamara "push", no estaría claro si estamos agregando cosas en la cola o encabezando la lista.

+8

Esto no tiene sentido ya que hay una operación 'pop'. Dado que 'push' y' pop' son típicamente operaciones de pila y van juntas, se debe esperar que operen en el mismo extremo de la lista. – jamesdlin

-1

Push es un comportamiento definido de stack; si presionaste A para apilar (B, C, D) obtendría (A, B, C, D).

Si utilizó append pitón, el conjunto de datos resultante se vería así (B, C, D, A)

Editar: Wow, la pedantería santo.

Supongo que de mi ejemplo quedaría claro qué parte de la lista es la parte superior y qué parte inferior. Suponiendo que la mayoría de nosotros leemos de izquierda a derecha, el primer elemento de cualquier lista siempre estará a la izquierda.

+0

Eso no es cierto, pop elimina del final de la lista, no desde el frente. – fortran

+4

lea la página que enlaza. push se define como presionar sobre la parte superior de la pila. cuyo fin es el "máximo" depende de la implementación. en una pila basada en arreglos, el empuje empujaría hacia el final de la matriz. en una pila basada en lista enlazada, push empujaría al principio. – Kip

+2

Obtienes un voto favorable de mi parte para compensar los downvotes innecesarios. – AndyPerfect

7

No es una respuesta oficial de ninguna manera (solo una suposición basada en el uso del idioma), pero Python le permite usar listas como stacks (por ejemplo, section 5.1.1 of the tutorial). Sin embargo, una lista sigue siendo, ante todo, una lista, por lo que las operaciones que son comunes a ambas utilizan términos de lista (es decir, anexar) en lugar de términos de pila (es decir, inserción). Como una operación pop no es tan común en las listas (aunque podría haberse usado "removeLast"), definieron un pop() pero no un push().

3

Ok, opinión personal aquí, pero Añadir y anexar implican posiciones precisas en un conjunto.

Push y Pop son realmente conceptos que se pueden aplicar a cualquiera de los extremos de un conjunto ... Siempre que sea coherente ... Por alguna razón, para mí, Push() parece que debería aplicarse a el frente de un conjunto ...

+3

Como ya sacó a colación, si las matrices tienen una función .append(), ¿por qué no hay una función correspondiente depreparar()? Puedo aprender a usar .insert (0, val) para anteponer, pero luego estoy avergonzado por la falta de una función correspondiente .delete (pos, val). ref: http://docs.python.org/2/library/array.html – MarkHu

3

FYI, no es terriblemente difícil hacer una lista que tiene un método 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] 

Una pila es un tipo de datos algo abstracta. La idea de "empujar" y "hacer estallar" es en gran medida independiente de cómo se implementa realmente la pila. Por ejemplo, se puede aplicar una pila teóricamente como esto (aunque no sé por qué lo haría):

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

... y no se han metido en el uso de listas enlazadas para implementar una pila.

-1

Push and Pop tiene sentido en términos de la metáfora de una pila de platos o bandejas en una cafetería o buffet, específicamente los que están en el tipo de titular que tiene un resorte debajo para que la placa superior sea (más o menos) . en teoría) en el mismo lugar sin importar cuántas placas hay debajo.

Si quita una bandeja, el peso en el muelle es un poco menor y la pila "sobresale" un poco, si vuelve a colocar la placa, "empuja" la pila hacia abajo. Entonces, si piensas en la lista como una pila y el último elemento en estar arriba, entonces no deberías tener mucha confusión.

Cuestiones relacionadas