De methoden append() en extend() van lijsten in Python dienen om elementen toe te voegen, maar doen dit op een fundamenteel verschillende manier:
append(obj) voegt één element (elke object, inclusief een lijst) toe aan het einde van de oorspronkelijke lijst.extend(iterable) voegt alle elementen van de iterabele object één voor één toe (het "ontrolt" als het ware tijdens het toevoegen).Voorbeeld:
lst = [1, 2, 3] lst.append([4, 5]) # Resultaat: [1, 2, 3, [4, 5]] lst = [1, 2, 3] lst.extend([4, 5]) # Resultaat: [1, 2, 3, 4, 5]
Dit verschil leidt vaak tot logische fouten wanneer men een "platte" lijst verwacht, maar een geneste lijst ontvangt.
Wat gebeurt er als je
list1 = [1, 2]; list2 = [3, 4]; list1.append(list2)doet? Hoe ziet list1 eruit? Wat is het verschil metlist1.extend(list2)?
Antwoord:
list1.append(list2) is het resultaat: [1, 2, [3, 4]] — de tweede lijst is toegevoegd als één element (geneste lijst).list1.extend(list2) is het resultaat: [1, 2, 3, 4] — de elementen van de tweede lijst zijn "ontrolt" en als aparte elementen toegevoegd.Verhaal
Een ontwikkelaar voegde de resultaten van parsing uit meerdere bestanden samen met
output.append(parsed_lines). Hierdoor kreeg hij in plaats van een lange platte lijst een lijst van lijsten (één element per bestand), wat de verdere verwerking verstoorde — in het bijzonder, functies die een reeks strings verwachtten begonnen fouten te geven op de invoergegevens.
Verhaal
In het project werd extend gebruikt voor het toevoegen van een string als "foo" (dat wil zeggen, de string werd als iterabel beschouwd). Dit leidde ertoe dat de karakters van de string aparte elementen van de lijst werden:
['f', 'o', 'o']in plaats van de gewenste "foo".
Verhaal
Bij het serialiseren van gegevens voor verzending naar JSON werden append/extend in een lus toegepast zonder het verschil te begrijpen. Dit resulteerde in structuren die de schema's verstoorden, waardoor sommige microservices faalden tijdens de validatie of niet correct functioneerden.