Quelle est la différence entre:
some_list1 = []
some_list1.append("something")
et
some_list2 = []
some_list2 += ["something"]
Quelle est la différence entre:
some_list1 = []
some_list1.append("something")
et
some_list2 = []
some_list2 += ["something"]
extend
.+=
vsextend
: stackoverflow.com/questions/3653298/…+=
vsappend
stackoverflow.com/q/252703/6674599Réponses:
Pour votre cas, la seule différence est la performance: l'ajout est deux fois plus rapide.
En général
append
, ajoutera un élément à la liste, tandis que+=
copiera tous les éléments de la liste de droite dans la liste de gauche.Mise à jour: analyse des performances
En comparant les bytecodes, nous pouvons supposer que la
append
version gaspille des cycles enLOAD_ATTR
+CALL_FUNCTION
et + = version - enBUILD_LIST
. Apparemment, l'BUILD_LIST
emporte surLOAD_ATTR
+CALL_FUNCTION
.Nous pouvons encore améliorer les performances en supprimant les
LOAD_ATTR
frais généraux:la source
append
vs+=
, vous devez inclure la création de la liste dans le cadre de la mesure. Sinon, ce serait une question différente (extend
vs+=
).Dans l'exemple que vous avez donné, il n'y a pas de différence, en termes de rendement, entre
append
et+=
. Mais il y a une différence entreappend
et+
(que la question posait à l'origine).Comme vous pouvez le voir,
append
et+=
avoir le même résultat; ils ajoutent l'élément à la liste, sans produire de nouvelle liste. L'utilisation+
ajoute les deux listes et produit une nouvelle liste.la source
append
ajoute une entrée à la liste, tandis que + = en ajoute autant qu'il y en a dans l'autre liste (c'est-à-dire les alias deextend
). Mais il / elle le sait déjà, à en juger par la manière dont la question a été écrite. Y a-t-il une autre différence qui me manque?Voir que append ajoute un seul élément à la liste, qui peut être n'importe quoi.
+=[]
rejoint les listes.la source
+ = est une affectation. Quand vous l'utilisez, vous dites vraiment "une_liste2 = une_liste2 + [" quelque chose "]". Les affectations impliquent une nouvelle liaison, donc:
L'opérateur + = devrait également créer normalement un nouvel objet de liste comme le fait normalement list + list:
Cependant en réalité:
C'est parce que les listes Python implémentent __iadd __ () pour créer un court-circuit d'affectation + = augmenté et appeler à la place list.extend (). (C'est un peu une verrue étrange ceci: cela fait généralement ce que vous vouliez dire, mais pour des raisons déroutantes.)
En général, si vous ajoutez / étendez une liste existante et que vous souhaitez conserver la référence à la même liste (au lieu d'en créer une nouvelle), il est préférable d'être explicite et de vous en tenir à append () / extend () méthodes.
la source
est en fait
pour une valeur, il n'y a pas de différence. La documentation indique que:
C'est donc évidemment la
s.append(x)
même chose ques.extend([x])
la source
La différence est que concaténer aplatit la liste résultante, tandis que append gardera les niveaux intacts:
Donc par exemple avec:
En utilisant append, vous vous retrouvez avec une liste de listes:
En utilisant concaténer à la place, vous vous retrouvez avec une liste plate:
la source
Les tests de performance ici ne sont pas corrects:
par exemple
de bons tests peuvent être trouvés ici: http://markandclick.com/1/post/2012/01/python-list-append-vs.html
la source
+= [one_var]
. Si nous omettons de créer des listes, + = devient l'option la plus rapide.En plus des aspects décrits dans les autres réponses, ajouter et + [] ont des comportements très différents lorsque vous essayez de construire une liste de listes.
list1 + ['5', '6'] ajoute '5' et '6' à la liste1 en tant qu'éléments individuels. list1.append (['5', '6']) ajoute la liste ['5', '6'] à la liste1 en tant qu'élément unique.
la source
Le comportement de réengagement mentionné dans d'autres réponses a de l'importance dans certaines circonstances:
En effet, l'affectation augmentée est toujours reliée, même si l'objet a été muté sur place. La reliure se trouve ici
a[1] = *mutated list*
, ce qui ne fonctionne pas pour les tuples.la source
prenons d'abord un exemple
la source
La méthode append () ajoute un seul élément à la liste existante
Donc, ici, some_list1 sera modifié.
Actualisé:
Tandis que l'utilisation de + pour combiner les éléments de listes (plus d'un élément) dans la liste existante similaire à l'extension (comme corrigé par Flux ).
Alors ici, some_list2 et ["something"] sont les deux listes qui sont combinées.
la source
+=
ne renvoie pas de nouvelle liste. La FAQ de programmation dit: "... pour les listes,__iadd__
équivaut à appelerextend
sur la liste et à renvoyer la liste. C'est pourquoi nous disons que pour les listes,+=
c'est un" raccourci "pourlist.extend
". Vous pouvez également le voir par vous-même dans le code source de CPython: github.com/python/cpython/blob/v3.8.2/Objects/…"+" ne modifie pas la liste
.append () mute l'ancienne liste
la source