¿Por qué las listas de python tienen pop () pero no push ()

¿Alguien sabe por qué la función list.append de Python no se llama list.push dado que ya existe una list.pop que elimina y devuelve el último elemento (que indexó en -1) y la semántica list.append es compatible con ese uso?

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

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

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

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

En otras palabras, para las stacks implementadas directamente como listas de Python, que ya son compatibles con fast append () 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.

Aquí está implícito que la mayoría de las personas deben adjuntar a una lista, pero muchas menos tienen la oportunidad de tratar las listas como stacks, por lo que list.append llegó mucho antes.

Porque se anexa; no empuja “Anexar” se agrega al final de una lista, “empujar” se agrega al frente.

Piense en una cola frente a una stack.

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

Edición: para volver a redactar mi segunda oración de manera más precisa, “anexar” implica claramente 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. Poner en una stack es poner algo “arriba”, pero el lugar que ocupa en la estructura de datos subyacente depende completamente de la implementación. Por otro lado, empujar en una cola implica agregarla al final.

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

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

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, la 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, adjuntar) en lugar de términos de stack (es decir, push). Dado que una operación pop no es tan común en las listas (aunque se podría haber usado ‘removeLast’), definieron un pop () pero no un push ().

Ok, la opinión personal aquí, pero Agregar y Preponer 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 y cuando sea consistente … Por alguna razón, para mí, Push () parece que debería aplicarse al frente de un conjunto…

Para su información, no es muy 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 stack es un tipo de datos algo abstracto. La idea de “empujar” y “hacer estallar” es en gran medida independiente de cómo se implementa realmente la stack. Por ejemplo, teóricamente podrías implementar una stack como esta (aunque no sé por qué lo harías):

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

… y no me he acostumbrado a usar listas vinculadas para implementar una stack.

Empujar es un comportamiento de stack definido; si presionaba A para astackr (B, C, D) obtendría (A, B, C, D).

Si usó el apéndice de Python, el conjunto de datos resultante se vería como (B, C, D, A)

Edit: 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 los que estamos aquí leemos de izquierda a derecha, el primer elemento de cualquier lista siempre estará a la izquierda.

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

La idea de que una lista se forma empujando cosas en la parte posterior de algo probablemente no sea tan conocida como la idea de agregarlas.

Push and Pop tiene sentido en términos de la metáfora de una stack 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 la placa superior es (más o menos … en teoría) en el mismo lugar no importa cuántos platos haya debajo.

Si retira una bandeja, el peso en el resorte es un poco menor y la stack “sube” un poco, si coloca la placa de nuevo, “empuja” la stack hacia abajo. Entonces, si piensas en la lista como una stack y el último elemento como en la parte superior, entonces no deberías tener mucha confusión.