eddie welker
¿Alguien sabe por qué Python list.append
la funcion no se llama list.push
dado que ya hay un list.pop
que elimina y devuelve el último elemento (el indexado en -1) y list.append
semántica es consistente con ese uso?
Porque “añadir” existía mucho antes de que se pensara en “pop”. pitón 0.9.1 list.append admitido a principios de 1991. En comparación, aquí hay parte de un discusión sobre comp.lang.python sobre agregar pop en 1997. Guido escribió:
Para implementar una pila, se 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 fanático de los nombres múltiples para la misma operación; tarde o temprano, leerá el código que usa el otro, así que necesitas aprender ambos, lo cual es más carga cognitiva.
También puede ver que analiza 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:
Sigo pensando que es mejor dejar todo esto fuera de la implementación del objeto de lista: si necesita una pila o una cola, con una semántica particular, escriba una pequeña clase que use una lista
En otras palabras, para las pilas implementadas directamente como listas de Python, que ya admiten la adición rápida () y la lista del[-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 necesitan agregar a una lista, pero muchos menos tienen la oportunidad de tratar las listas como pilas, razón por la cual list.append apareció mucho antes.
-
@poige
you're going to *read* code that uses the other one (...) which is more cognitive load
Recordar que “no hay empuje” solo introduce una carga cognitiva cuando estás escribiendo código. Recordar que “empujar es un sinónimo exacto de agregar” introduce una carga cognitiva cada vez que lee el que ve que se usa con menos frecuencia. Consulte stackoverflow.com/questions/3455488/… para obtener más información sobre por qué las personas piensan que la legibilidad a menudo supera la capacidad de escritura.– stevenjackson121
1 de octubre de 2016 a las 3:51
-
No tiene ninguna excusa/sentido
– poige
1 oct 2016 a las 12:16
-
3455488 es 404… aunque no estoy seguro de si eso refleja más las políticas de S/O que ese argumento…?
–Ed Randall
15 de diciembre de 2020 a las 8:53
-
@EdRandall esta pregunta está archivada aquí: web.archive.org/web/20170422054706/https://stackoverflow.com/…
– Karol Zlot
3 de agosto de 2021 a las 11:22
pelota mate
Porque añade; 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/estructuras de datos.html
Editar: Para reformular mi segunda oración más exactamente, “Agregar” implica muy claramente agregar algo a la final de una lista, independientemente de la implementación subyacente. Donde se agrega un nuevo elemento cuando se “empuja” es menos claro. Empujar en una pila es poner algo “en la parte superior”, pero el lugar en la estructura de datos subyacente depende completamente de la implementación. Por otro lado, empujar a una cola implica agregarla al final.
-
El tutorial parece sugerir que simplemente empuja y salta 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 en salir “). Para agregar un elemento en la parte superior de la pila, use append(). Para recuperar un elemento en la parte superior de la pila, use pop() sin un índice explícito. “
– uri
14 de octubre de 2009 a las 13:39
-
“empujar” de ninguna manera significa agregar al frente. cada implementación de una pila que alguna vez ha sido escrita por una persona en su sano juicio “empuja” hacia la parte superior (final) de la pila, no hacia la parte inferior (inicio) de la pila
– Kip
14 de octubre de 2009 a las 13:42
-
corrección: cada *basado en matriz implementación. una implementación de lista enlazada empujaría a la cabeza.
– Kip
14 de octubre de 2009 a las 13:47
-
javascript
push
añade al final.– Kobi
14 de octubre de 2009 a las 13:48
-
No, teniendo en cuenta
list.pop
semántica,list.append
empuja elementos a la lista, cuando se ve como una pila.– Fortran
14 de octubre de 2009 a las 13:52
¿Porque agrega un elemento a una lista? Push se usa generalmente cuando se refiere a pilas.
-
Sin embargo, una lista puede ser una pila. 🙂
–Jason Baker
14 de octubre de 2009 a las 13:59
-
@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!)
–Mark E. Haase
21/09/2013 a las 20:54
-
La confusión realmente proviene del hecho de que una pila no tiene un “comienzo” o un “final” como una lista, sino 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 para hacer las cosas aún más confusas, C++ usa “push_front” y “push_back”.
– JesperE
23 de septiembre de 2013 a las 9:09
Porque “agregar” intuitivamente significa “agregar al final de la lista”. Si se llamara “push”, entonces no estaría claro si estamos agregando cosas al final o al principio de la lista.
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 ante todo una lista, por lo que las operaciones que son comunes a ambas usan términos de lista (es decir, agregar) en lugar de términos de pila (es decir, empujar). 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().
jason panadero
FYI, no es terriblemente difícil hacer una lista que tenga 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 abstracto. La idea de “empujar” y “hacer estallar” es en gran medida independiente de cómo se implementa realmente la pila. Por ejemplo, teóricamente podría implementar una pila como esta (aunque no sé por qué lo haría):
l = [1,2,3]
l.insert(0, 1)
l.pop(0)
… y no me he metido en el uso de listas enlazadas para implementar una pila.
dice
Ok, opinión personal aquí, pero Agregar y Anteponer implican posiciones precisas en un conjunto.
Push y Pop son realmente conceptos que se pueden aplicar a cualquier extremo de un conjunto… Siempre y cuando seas consistente… Por alguna razón, para mí, Push() parece que debería aplicarse al frente de un establecer…
-
Ya que lo mencionaste, si las matrices tienen una función .append(), ¿por qué no hay una función .prepend() correspondiente? Puedo aprender a usar .insert(0,val) para anteponer, pero luego me avergüenzo de la falta de una función .delete(pos,val) correspondiente. árbitro: docs.python.org/2/library/array.html
– MarkHu
5 de diciembre de 2012 a las 18:32
–Tim Pietzcker
14 de octubre de 2009 a las 13:39
pop
puede sacar elementos de cualquier parte de una lista.append
no puede “empujar” algo al medio de una lista.– endolito
28 de agosto de 2014 a las 0:30
@TimPietzcker El método es, de hecho, también una función, el método (función miembro) es un subconjunto de la función 🙂
– jave.web
5 de marzo de 2020 a las 12:10
@jave.web ^2>
– szaman
11 oct 2021 a las 11:07