150 votes

Python append () vs. + opérateur sur les listes, pourquoi celles-ci donnent-elles des résultats différents?

Pourquoi ces deux opérations donnent-elles des résultats différents?

 >>> c = [1, 2, 3]
>>> c
[1, 2, 3]
>>> c += c
>>> c
[1, 2, 3, 1, 2, 3]
>>> c = [1, 2, 3]
>>> c.append(c)
>>> c
[1, 2, 3, [...]]
>>> 
 

Dans le dernier cas, il y a une récursion infinie. c [-1] et c sont identiques. Pourquoi est-ce différent avec l'opération +?

181voto

Abel Points 24335

Pour expliquer "pourquoi":

L' + fonctionnement ajoute au tableau les éléments du tableau d'origine. L' array.append insère la matrice (ou un objet) à la fin du tableau d'origine, ce qui résulte en une référence à l'autonomie dans cet endroit (d'où la récursivité infinie).

La différence ici est que l'opération + actes spécifiques lorsque vous ajoutez un tableau (c'est surchargé comme les autres, voir ce chapitre sur les séquences) par la concaténation de l'élément. L'ajout de la méthode, cependant, fait littéralement ce que vous demandez: ajouter l'objet sur le côté droit que vous lui donnez (le tableau ou tout autre objet), au lieu de prendre ses éléments.

Une alternative

Utiliser extend() si vous souhaitez utiliser une fonction qui agit similaire à l'opérateur + (comme d'autres l'ont montré ici). Il n'est pas sage de faire le contraire: pour tenter d'imiter ajouter avec l'opérateur + pour les listes (voir ma précédente lien sur pourquoi).

Un peu d'histoire

Pour le plaisir, un peu d'histoire: la naissance de la matrice de module en Python , en février 1993. il pourrait vous surprendre, mais les tableaux ont été ajoutés après les séquences et les listes sont entrés en existence.

33voto

Dave Points 83

L'opérateur de concaténation + est un binaire opérateur infixe qui, lorsqu'il est appliqué à des listes, retourne une nouvelle liste contenant tous les éléments de chacun de ses deux opérandes. L' list.append() est une méthode d' mutator sur list qui ajoute son single object argument (dans votre exemple de la liste c) de l'objet list. Dans votre exemple, il en résulte c ajout d'une référence à lui-même (d'où la récursivité infinie).

Une alternative à '+' concaténation

L' list.extend() méthode est également une méthode mutateur qui concatène ses sequence argument avec le sujet list. Plus précisément, il ajoute à chacun des éléments de sequence dans l'itération de l'ordre.

D'un côté

Étant un opérateur, + retourne le résultat de l'expression comme une nouvelle valeur. Étant un non-chaînage mutator méthode, list.extend() modifie la liste des sujets en place et ne renvoie rien.

Les tableaux

J'ai ajouté ceci en raison de la confusion qui l'Abel de la réponse ci-dessus peut entraîner par le mélange de la discussion, des listes, des séquences et des tableaux. Arrays ont été ajoutés à Python après des séquences et des listes, comme un moyen plus efficace de stocker des tableaux de l'ensemble des types de données. Ne pas confondre arrays avec lists. Ils ne sont pas les mêmes.

À partir de la matrice de docs:

Les tableaux sont des types de séquence et se comportent tout à fait comme les listes, sauf que le type des objets qui y sont conservés sont limitées. Le type est spécifié lors de la création d'un objet de temps à l'aide d'un code de type, qui est un caractère unique.

23voto

SilentGhost Points 79627

append ajoute un élément à une liste. si vous souhaitez étendre la liste avec la nouvelle liste, vous devez utiliser extend .

 >>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
 

9voto

Tendayi Mawushe Points 10335

Python, les listes sont hétérogènes que sont les éléments dans la même liste peut être n'importe quel type d'objet. L'expression: c.append(c) ajoute l'objet c de ce que jamais il est peut-être à la liste. Dans le cas où il fait la liste elle-même un membre de la liste.

L'expression c += c ajoute deux listes ensemble et affecte le résultat à la variable c. Surchargées + opérateur est défini sur les listes créer une liste dont le contenu sont les éléments de la première liste et les éléments dans la deuxième liste.

Donc, ce sont vraiment différentes expressions utilisées pour faire des choses différentes de par leur conception.

7voto

Chinmay Kanchi Points 16353

La méthode que vous recherchez est extend() . De la documentation Python:

 list.append(x)
    Add an item to the end of the list; equivalent to a[len(a):] = [x].

list.extend(L)
    Extend the list by appending all the items in the given list; equivalent to a[len(a):] = L.

list.insert(i, x)
    Insert an item at a given position. The first argument is the index of the element before which to insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is equivalent to a.append(x).
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X