Pourquoi ces deux opérations ( append()
resp. +
) 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 en fait une récursion infinie. c[-1]
et c
sont les mêmes. Pourquoi est-ce différent avec l' +
opération?
python
list
append
nested-lists
ooboo
la source
la source
+=
: stackoverflow.com/questions/725782/…Réponses:
Pour expliquer «pourquoi»:
L'
+
opération ajoute les éléments du tableau au tableau d'origine. L'array.append
opération insère le tableau (ou n'importe quel objet) à la fin du tableau d'origine, ce qui se traduit par une référence à soi à cet endroit (d'où la récursivité infinie).La différence ici est que l'opération + agit de manière spécifique lorsque vous ajoutez un tableau (il est surchargé comme les autres, voir ce chapitre sur les séquences) en concaténant l'élément. La méthode append fait cependant littéralement ce que vous demandez: ajoutez 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 de manière similaire à l'opérateur + (comme d'autres l'ont également montré ici). Il n'est pas sage de faire le contraire: d'essayer d'imiter append avec l'opérateur + pour les listes (voir mon lien précédent sur pourquoi).Peu d'histoire
Pour le plaisir, un peu d'histoire: la naissance du module de tableau en Python en février 1993. cela pourrait vous surprendre, mais les tableaux ont été ajoutés bien après la création des séquences et des listes.
la source
+
à être symétriques: concaténer la liste avec la liste.L'opérateur de concaténation
+
est un opérateur d'infixe binaire qui, lorsqu'il est appliqué aux listes, retourne une nouvelle liste contenant tous les éléments de chacun de ses deux opérandes. Lalist.append()
méthode est unmutator
surlist
lequel ajoute sonobject
argument unique (dans votre exemple spécifique, la listec
) au sujetlist
. Dans votre exemple, cela se traduit par l'c
ajout d'une référence à lui-même (d'où la récursivité infinie).Une alternative à la concaténation '+'
La
list.extend()
méthode est également une méthode mutatrice qui concatène sonsequence
argument avec le sujetlist
. Plus précisément, il ajoute chacun des éléments desequence
dans l'ordre d'itération.Un aparté
Étant un opérateur,
+
renvoie le résultat de l'expression sous forme de nouvelle valeur. Étant unemutator
méthode sans chaînage ,list.extend()
modifie la liste de sujets sur place et ne renvoie rien.Tableaux
J'ai ajouté cela en raison de la confusion potentielle que la réponse d'Abel ci-dessus peut causer en mélangeant la discussion sur les listes, les séquences et les tableaux.
Arrays
ont été ajoutés à Python après les séquences et les listes, comme moyen plus efficace de stocker des tableaux de types de données intégraux. Ne confondez pasarrays
aveclists
. Ils ne sont pas les mêmes.À partir de la documentation sur le tableau :
Les tableaux sont des types de séquence et se comportent très comme des listes, sauf que le type d'objets qui y sont stockés est contraint. Le type est spécifié au moment de la création de l'objet à l'aide d'un code de type, qui est un seul caractère.
la source
append
ajoute un élément à une liste. si vous souhaitez étendre la liste avec la nouvelle liste que vous devez utiliserextend
.la source
+
etextend
produirait des résultats différents auxquels nous aurions quelque chose à penser.append
et+
sont différentes. C'est pourquoi. J'aime cette réponse car elle propose ce que faire qui a plus de sens.__lt__
ne peut pas être surchargé en Python (de nos jours, il le peut). Les questions sur le pourquoi sont les plus essentielles mais souvent les plus délicates à répondre: elles demandent l'essentiel, pas un pointeur vers le manuel. Et bien sûr: si vous n'aimez pas une question (je n'aime pas le plus), alors ne répondez pas ;-)c += [c]
etc.append(c[:])
aussi.a+b != a*b
? Ce sont des opérations différentes. Voilà la réponse. "Pourquoi" n'est pas aussi utile que d'autres questions, comme "Comment puis-je ajouter correctement?" Ou "Quel est le problème avec cet append qui conduit à une récursivité infinie?" Questions du formulaire "Que dois-je faire à X" ou "Qu'est-ce qui ne va pas quand j'ai fait X"? Ou «Que dois-je faire à la place de X» aidera également quelqu'un à apprendre, mais fournira des réponses ciblées, utilisables et exploitables.Les listes Python sont hétérogènes, c'est-à-dire que les éléments d'une même liste peuvent être n'importe quel type d'objet. L'expression:
c.append(c)
ajoute l'objetc
quel qu'il soit à la liste. Dans le cas où il fait de la liste elle-même un membre de la liste.L'expression
c += c
ajoute deux listes ensemble et affecte le résultat à la variablec
. L'+
opérateur surchargé est défini sur les listes pour créer une nouvelle liste dont le contenu est constitué des éléments de la première liste et des éléments de la seconde liste.Ce ne sont donc que des expressions différentes utilisées pour faire différentes choses par conception.
la source
La méthode que vous recherchez est
extend()
. À partir de la documentation Python :la source
vous devriez utiliser extend ()
autres informations: ajouter ou étendre
la source
Consultez la documentation :
c.append(c)
"ajoute" c à lui-même en tant qu'élément . Puisqu'une liste est un type de référence, cela crée une structure de données récursive.c += c
est équivalent àextend(c)
, qui ajoute les éléments de c à c.la source