Est-ce que quelqu'un sait pourquoi la list.append
fonction de Python n'est pas appelée list.push
étant donné qu'il y a déjà un list.pop
qui supprime et renvoie le dernier élément (celui indexé à -1) et la list.append
sémantique est cohérente avec cette utilisation?
265
pop
peut sortir des éléments de n'importe où dans une liste.append
ne peut pas "pousser" quelque chose au milieu d'une liste.Réponses:
Parce que "ajouter" existait bien avant que l'on pense à "pop". Python 0.9.1 supporte list.append au début de 1991. Par comparaison, voici une partie d'une discussion sur comp.lang.python sur l'ajout de pop en 1997. Guido a écrit:
Vous pouvez également voir qu'il discute de l'idée de savoir si push / pop / put / pull doit être à l'élément [0] ou après l'élément [-1] où il poste une référence à la liste des icônes:
En d'autres termes, pour les piles implémentées directement en tant que listes Python, qui prennent déjà en charge fast append () et del list [-1], il est logique que list.pop () fonctionne par défaut sur le dernier élément. Même si d'autres langues le font différemment.
Implicitement, 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.append est arrivé beaucoup plus tôt.
la source
you're going to *read* code that uses the other one (...) which is more cognitive load
Se souvenir "qu'il n'y a pas de poussée" n'introduit que la charge cognitive lorsque vous écrivez du code. Se souvenir de "push est un synonyme exact de append" introduit une charge cognitive chaque fois que vous lisez celle que vous voyez utilisée moins souvent. Voir stackoverflow.com/questions/3455488/… pour en savoir plus sur les raisons pour lesquelles les gens pensent que la lisibilité l'emporte souvent sur l'écritureParce qu'il ajoute; ça 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 ma deuxième phrase plus exactement, "Ajouter" implique très clairement d'ajouter quelque chose à la fin d'une liste, quelle que soit l'implémentation sous-jacente. L'endroit où un nouvel élément est ajouté lorsqu'il est "poussé" est moins clair. Pousser sur une pile, c'est mettre quelque chose au "dessus", 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 dans une file d'attente implique de l'ajouter à la fin.
la source
push
ajoute à la fin.list.pop
sémantique,list.append
pousse les éléments dans la liste, lorsqu'ils sont vus comme une pile.Parce qu'il ajoute un élément à une liste? Push est généralement utilisé pour faire référence aux piles.
la source
Parce que "ajouter" signifie intuitivement "ajouter à la fin de la liste". Si cela s'appelait "push", il serait difficile de savoir si nous ajoutons des éléments en queue ou en tête de liste.
la source
pop
opération. Etant donnépush
que cepop
sont généralement des opérations de pile et vont de pair, il faut s'attendre à ce qu'elles fonctionnent à la même extrémité de la liste.Pas une réponse officielle par tous les moyens (juste une supposition basée sur l'utilisation de la langue), mais Python vous permet d'utiliser des listes comme piles (par exemple, la section 5.1.1 du tutoriel ). Cependant, une liste est avant tout une liste, donc les opérations qui sont communes aux deux utilisent des termes de liste (ie, ajouter) plutôt que des termes de pile (ie, push). Puisqu'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 ().
la source
Ok, opinion personnelle ici, mais ajouter et ajouter des positions implicites précises dans un ensemble.
Push et Pop sont vraiment des concepts qui peuvent être appliqués à l'une ou l'autre extrémité d'un ensemble ... Aussi longtemps que vous êtes cohérent ... Pour une raison quelconque, Push () semble qu'il devrait s'appliquer à l'avant d'un ensemble...
la source
Pour info, ce n'est pas très difficile de faire une liste qui a une méthode push:
Une pile est un type de données quelque peu abstrait. L'idée de «pousser» et de «sauter» est largement indépendante de la façon dont la pile est réellement mise en œuvre. Par exemple, vous pourriez théoriquement implémenter une pile comme celle-ci (bien que je ne sache pas pourquoi vous le feriez):
... et je n'ai pas commencé à utiliser des listes chaînées pour implémenter une pile.
la source
Push est un comportement de pile défini ; si vous poussiez A sur la pile (B, C, D) vous obtiendrez (A, B, C, D).
Si vous avez utilisé python append, l'ensemble de données résultant ressemblerait à (B, C, D, A)
Edit: Wow, sainte pédanterie.
Je suppose que mon exemple montre clairement quelle partie de la liste est en haut et quelle partie en bas. En supposant que la plupart d'entre nous lisons ici de gauche à droite, le premier élément de toute liste sera toujours à gauche.
la source
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 les choses au dos de quelque chose n'est probablement pas aussi connue que l'idée de les annexer.
la source
Push and Pop a du 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 l'assiette supérieure est (plus ou moins ... en théorie) au même endroit, peu importe le nombre de plaques en dessous.
Si vous retirez un plateau, le poids sur le ressort est un peu moins élevé et la pile "ressort" un peu, si vous remettez la plaque, elle "pousse" la pile vers le bas. Donc, si vous pensez que la liste est une pile et que le dernier élément est en haut, vous ne devriez pas avoir beaucoup de confusion.
la source