Pourquoi les listes python ont-elles pop () mais pas push()

Est-ce que quelqu'un sait pourquoi la fonction list.append de Python n'est pas appelée list.push étant donné qu'il existe déjà un list.pop qui supprime et renvoie le dernier élément (indexé à -1) et list.append sémantique est compatible avec cette utilisation?

227
demandé sur Gaz_Edge 2009-10-14 17:34:26

10 réponses

Parce que "append" existait bien avant que " pop " ne soit pensé. Python 0.9.1 Liste prise en charge.ajouter au début de 1991. En comparaison, voici une partie d'une discussion sur comp.lang.python à propos de l'ajout de pop en 1997. Guido a écrit:

Pour implémenter une pile, il faudrait pour ajouter une liste.pop() primitive (et non, je ne suis pas contre cette un sur la base de tout Principe). liste.push() pourrait être ajouté pour la symétrie avec la liste.pop () mais je ne suis pas un grand fan de plusieurs noms pour le la même opération -- tôt ou tard vous allez lire le code qui utilise l'autre, de sorte que vous devez apprendre les deux, ce qui est une charge plus cognitive.

Vous pouvez également voir qu'il discute de l'idée de si push / pop / put / pull devrait être à l'élément [0] ou après l'élément [-1] où il poste une référence à la liste de L'icône:

Je pense toujours que tout cela est le meilleur laissé hors de l'objet de liste implémentation - si vous avez besoin d'une pile, ou une file d'attente, avec particulier sémantique, écrivez un petit cours qui utilise une liste

En d'autres termes, pour les piles implémentées directement en tant que listes Python, qui supporte déjà fast append (), et del list[-1], il est logique que cette liste.pop() fonctionne par défaut sur le dernier élément. Même si d'autres langues le font différemment.

Implicite ici est que la plupart des gens ont besoin d'ajouter à une liste, mais beaucoup moins ont l'occasion de traiter les listes comme des piles, c'est pourquoi list.ajouter venu dans beaucoup plus tôt.

217
répondu Andrew Dalke 2009-10-14 21:07:43

Parce qu'il ajoute; il ne pousse pas. "Ajouter" ajoute à la fin d'une liste, "pousser" ajoute à l'avant.

Pensez à une file d'attente par rapport à une pile.

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

Edit: pour reformuler plus exactement ma deuxième phrase, "ajouter" implique très clairement d'ajouter quelque chose à end d'une liste, quelle que soit l'implémentation sous-jacente. Lorsqu'un nouvel élément est ajouté quand il est "poussé" est moins claire. Pousser sur une pile est de mettre quelque chose sur "top", mais où il va réellement dans la structure de données sous-jacente dépend complètement de l'implémentation. D'un autre côté, pousser sur une file d'attente implique de l'ajouter à la fin.

13
répondu Matt Ball 2009-10-14 14:01:20

Parce qu'il ajoute un élément à une liste? Push est généralement utilisé en se référant à des piles.

10
répondu JesperE 2009-10-14 13:37:03

Parce que "Ajouter" signifie intuitivement "ajouter à la fin de la liste". Si cela s'appelait "push", alors il ne serait pas clair si nous ajoutons des choses à la queue ou en tête de la liste.

9
répondu Gyom 2009-10-14 13:38:01

Pas une réponse officielle (juste une supposition basée sur l'utilisation du langage), mais Python vous permet d'utiliser des listes comme des piles (par exemple, section 5.1.1 du tutoriel). Cependant, une liste est toujours avant tout une liste, de sorte que les opérations communes aux deux utilisent des termes de liste (c'est-à-dire ajouter) plutôt que des termes de pile (c'est-à-dire pousser). Comme une opération pop n'est pas si courante dans les listes (bien que 'removeLast' ait pu être utilisé), ils ont défini un pop () mais pas un push ().

7
répondu Uri 2009-10-14 13:38:56

Ok, opinion personnelle ici, mais ajouter et Ajouter impliquent des positions précises dans un ensemble.

Push et Pop sont vraiment des concepts qui peuvent être appliqués à chaque extrémité d'un ensemble... Aussi longtemps que vous êtes cohérent... Pour quelque raison, pour moi, Push() semble comme il devrait s'appliquer à l'avant d'un ensemble...

3
répondu dicroce 2009-10-14 13:42:32

POUR INFO, il n'est pas terriblement difficile de faire une liste qui a une méthode 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]

Une pile est un type de données quelque peu abstrait. L'idée de "pousser" et de "popping" est largement indépendante de la façon dont la pile est réellement implémentée. Par exemple, vous pouvez théoriquement implémenter une pile comme celle-ci (bien que je ne sache pas pourquoi vous le feriez):

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

...et je n'ai pas utilisé de listes liées pour implémenter une pile.

3
répondu Jason Baker 2009-10-14 13:46:01

Probablement parce que la version originale de Python ( C Python) a été écrite en C, pas en C++.

L'idée qu'une liste est formée en poussant des choses à l'arrière de quelque chose n'est probablement pas aussi connue que l'idée de les ajouter.

0
répondu unwind 2009-10-14 13:38:01

Push est un comportement stack défini; si vous poussez a sur stack (B,C,D) vous obtiendrez (A,B,C, D).

Si vous avez utilisé Python append, le jeu de données résultant ressemblerait à (B,C,D, A)

Modifier: Wow, Sainte pédanterie.

Je suppose qu'il serait clair d'après mon exemple quelle partie de la liste est la partie supérieure et quelle partie est la partie inférieure. En supposant que la plupart d'entre nous ici lisent de gauche à droite, le premier élément de toute liste sera toujours à gauche.

0
répondu Satanicpuppy 2009-10-14 14:13:15

Push et Pop ont un sens en termes de métaphore d'une pile d'assiettes ou de plateaux dans une cafétéria ou un buffet, en particulier ceux du type de support qui a un ressort en dessous de sorte que la plaque supérieure est (plus ou moins... en théorie) au même endroit, peu importe combien de plaques sont en dessous.

Si vous retirez un plateau, le poids sur le ressort est un peu moins et la pile "saute" un peu, si vous remettez la plaque, elle"pousse" la pile vers le bas. Donc, si vous pensez à la liste comme une pile et le dernier élément comme étant sur le dessus, alors vous ne devriez pas avoir beaucoup de confusion.

-1
répondu bob 2011-01-20 20:56:08