I metodi append() ed extend() delle liste in Python servono per aggiungere elementi, ma lo fanno in modo fondamentalmente diverso:
append(obj) aggiunge un singolo elemento (qualsiasi oggetto — incluso una lista) alla fine della lista originale.extend(iterable) aggiunge tutti gli elementi dell'oggetto iterabile uno alla volta (come se "esponesse" gli elementi durante l'aggiunta).Esempio:
lst = [1, 2, 3] lst.append([4, 5]) # Risultato: [1, 2, 3, [4, 5]] lst = [1, 2, 3] lst.extend([4, 5]) # Risultato: [1, 2, 3, 4, 5]
Questa differenza spesso causa errori logici, quando ci si aspetta una lista "piana" e si ottiene una lista annidata.
Cosa succede se faccio
list1 = [1, 2]; list2 = [3, 4]; list1.append(list2)? Come appare list1? Qual è la differenza rispetto alist1.extend(list2)?
Risposta:
list1.append(list2) il risultato è: [1, 2, [3, 4]] — la seconda lista è stata aggiunta come un singolo elemento (lista annidata).list1.extend(list2) il risultato è: [1, 2, 3, 4] — gli elementi della seconda lista sono "esposti" e aggiunti come elementi separati.Storia
Uno sviluppatore, unendo i risultati di parsing da più file, ha utilizzato
output.append(parsed_lines). Di conseguenza, invece di una lunga lista piatta ha ottenuto una lista di liste (un elemento per ogni file), il che ha rotto tutto il successivo trattamento — in particolare, le funzioni che si aspettavano una sequenza di stringhe hanno iniziato a generare errori sui dati di input.
Storia
Nel progetto si è utilizzato extend per aggiungere una stringa come "foo" (quindi la stringa era trattata come iterabile). Questo ha portato al fatto che i caratteri della stringa sono diventati elementi separati della lista:
['f', 'o', 'o']invece di ottenere "foo".
Storia
Durante la serializzazione dei dati per la trasmissione in JSON, sono stati utilizzati append/extend in un ciclo senza capire la differenza. Di conseguenza, si sono ottenute strutture che violavano lo schema, causando crash di alcuni microservizi durante la fase di validazione o funzionamenti errati.