¿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 list.append semántico es consistente con ese uso?

277
Eddie Welker 14 oct. 2009 a las 17:34

10 respuestas

La mejor respuesta

Porque "agregar" existía mucho antes de que se pensara "pop". Python 0.9.1 admite list.append a principios de 1991. En comparación , aquí hay parte de un discusión en comp.lang.python sobre agregar pop en 1997. Guido escribió:

Para implementar una pila, uno necesitaría agregar una primitiva list.pop () (y no, no estoy en contra de esta en particular sobre la base de ningún principio). list.push () podría agregarse por simetría con list.pop () pero no soy un gran admirador de los nombres múltiples para la misma operación; tarde o temprano leerás el código que usa el otro, así que necesitas aprender ambos, que es más carga cognitiva.

También puede ver que él discute la idea de si push / pop / put / pull debería estar en el elemento [0] o después del elemento [-1] donde publica una referencia a la lista de Icon:

Todavía creo que es mejor dejar todo esto fuera de la implementación del objeto de la lista: si necesita una pila o una cola, con una semántica particular, escriba una pequeña clase que use listas

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

Implícito aquí es que la mayoría de las personas necesita agregar una lista, pero muchas menos tienen la oportunidad de tratar las listas como pilas, por lo que list.append llegó mucho antes.

256
Andrew Dalke 14 oct. 2009 a las 21:07

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 en el tipo de soporte que tiene un resorte debajo, por lo que el plato superior es (más o menos ... en teoría) en el mismo lugar sin importar cuántas placas hay debajo.

Si retira una bandeja, el peso sobre el resorte es un poco menor y la pila "sube" un poco, si vuelve a colocar el plato, "empuja" la pila hacia abajo. Entonces, si piensa que la lista es una pila y el último elemento está en la parte superior, entonces no debería tener mucha confusión.

-2
bob 20 ene. 2011 a las 20:56

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

La idea de que se forme una lista empujando las cosas hacia atrás de algo probablemente no sea tan conocida como la idea de agregarlas.

0
unwind 14 oct. 2009 a las 13:38

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

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

Editar: Wow, santa pedantería.

Supongo que de mi ejemplo quedaría claro qué parte de la lista es la parte superior y qué parte es la 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.

1
Satanicpuppy 14 oct. 2009 a las 14:13

Para su información, no es terriblemente difícil hacer una lista que tenga un método de inserción:

>>> 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 abstracto. La idea de "empujar" y "estallar" es en gran medida independiente de cómo se implementa realmente la pila. Por ejemplo, teóricamente podrías implementar una pila como esta (aunque no sé por qué lo harías):

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

... y no he usado listas enlazadas para implementar una pila.

3
Jason Baker 14 oct. 2009 a las 13:46

Ok, la opinión personal aquí, pero Añadir y Anteponer implica posiciones precisas en un conjunto.

Push y Pop son realmente conceptos que se pueden aplicar a cualquier extremo de un conjunto ... Siempre y cuando sea consistente ... Por alguna razón, para mí, Push () parece que debería aplicarse al frente de un conjunto...

3
dicroce 14 oct. 2009 a las 13:42

No es una respuesta oficial de ninguna manera (solo una suposición basada en el uso del lenguaje), pero Python le permite usar listas como pilas (por ejemplo, sección 5.1.1 del tutorial). Sin embargo, una lista sigue siendo en primer lugar una lista, por lo que las operaciones que son comunes a ambos usan términos de lista (es decir, agregar) en lugar de términos de pila (es decir, push). Dado que 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 ().

7
Uri 14 oct. 2009 a las 13:38

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

9
Gyom 14 oct. 2009 a las 13:38

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

10
JesperE 14 oct. 2009 a las 13:37

Porque anexa; No empuja. "Agregar" se agrega al final de una lista, "presionar" se agrega al frente.

Piense en una cola frente a una pila.

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

Editar: Para reformular mi segunda oración más exactamente, "Agregar" muy claramente implica agregar algo al final de una lista, independientemente de la implementación subyacente. Donde un nuevo elemento se agrega cuando se "empuja" es menos claro. Empujar sobre una pila es poner algo en la "parte superior", pero donde realmente va en la estructura de datos subyacente depende completamente de la implementación. Por otro lado, empujar a una cola implica agregarlo al final.

14
Matt Ball 14 oct. 2009 a las 14:01