Les méthodes append() et extend() pour les listes en Python servent à ajouter des éléments, mais elles le font de manière fondamentalement différente :
append(obj) ajoute un élément (n'importe quel objet, y compris une liste) à la fin de la liste d'origine.extend(iterable) ajoute tous les éléments de l'objet itérable un par un (comme s'il "dépliait" cet objet lors de l'ajout).Exemple :
lst = [1, 2, 3] lst.append([4, 5]) # Résultat : [1, 2, 3, [4, 5]] lst = [1, 2, 3] lst.extend([4, 5]) # Résultat : [1, 2, 3, 4, 5]
Cette différence est souvent à l'origine d'erreurs logiques, lorsque l'on s'attend à une liste "plate" et que l'on obtient des listes imbriquées.
Que se passe-t-il si l'on fait
list1 = [1, 2]; list2 = [3, 4]; list1.append(list2)? À quoi ressemble list1 ? Quelle est la différence aveclist1.extend(list2)?
Réponse :
list1.append(list2), le résultat est : [1, 2, [3, 4]] — la deuxième liste a été ajoutée comme un seul élément (liste imbriquée).list1.extend(list2), le résultat est : [1, 2, 3, 4] — les éléments de la deuxième liste ont été "dépliés" et ajoutés en tant qu'éléments distincts.Histoire
Un développeur, en combinant les résultats de l'analyse de plusieurs fichiers, faisait
output.append(parsed_lines). En résultat, au lieu d'une longue liste plate, il obtenait une liste de listes (un élément par fichier), ce qui cassait tout le traitement ultérieur — en particulier, les fonctions qui attendaient une séquence de chaînes rencontraient des erreurs avec les données d'entrée.
Histoire
Dans un projet, extend était utilisé pour ajouter une chaîne comme "foo" (c'est-à-dire que la chaîne était considérée comme itérable). Cela a conduit à ce que les caractères de la chaîne deviennent des éléments séparés de la liste :
['f', 'o', 'o']au lieu du souhaité "foo".
Histoire
Lors de la sérialisation des données pour transmission au JSON, append/extend étaient utilisés en boucle sans comprendre la différence. En conséquence, des structures contraires au schéma étaient produites, ce qui entraînait des échecs de certaines microservices lors de la validation ou un fonctionnement incorrect.