Funkcje append i extend na listach

Chcąc dodać elementy do listy w Pythonie możemy użyć jednej w dwóch metod: append i extend. Jakie są między nimi różnice i jakie efekty pozwalają uzyskać? Poznaj obie, by osiągać zamierzony efekt i uniknąć zaskoczenia. Zacznijmy od przykładu.

Tworzymy bardzo prostą listę trójelementową, zawierającą wydatki z trzech kolejnych dni:

lista = [10, 23, 15]
# lista
# [10, 23, 15]

Chcąc dodać do listy wydatek z kolejnego dnia, czyli kolejny element, możemy użyć metody append:

lista.append(9)
# lista
# [10, 23, 15, 9]

Niewiele nas tu zaskakuje. A jeśli chcemy dodać więcej niż jeden element naraz, np. gdy dodajemy wydatki za kilka dni? Spróbujmy:

lista.append([56, 16])
# lista
# [10, 23, 15, 9, [56, 16]]

Cóż, nie do końca o to nam chodziło. Może chcielibyśmy zrobić sumę wydatków za ten tydzień, zobaczyć jaką najwyższą, a jaką najniższą kwotę wydaliśmy. Z tak zagnieżdżoną strukturą sprawa niepotrzebnie by się skomplikowała. Czy można zatem dodać kilka elementów do listy, bez zagnieżdżania jej struktury? Jak najbardziej. Z pomocą przyjdzie nam funkcja extend, która dodaje elementy do listy dodatkowo spłaszczając strukturę:

lista = [10, 23, 15]
# lista
# [10, 23, 15]

lista.extend([9, 56, 16])
# lista
# [10, 23, 15, 9, 56, 16]

Czyli efekt odpowiada naszym założeniom. Możemy teraz korzystać z kilku wbudowanych funkcji licząc np. sumę albo maximum:

sum(lista)
# 129
max(lista)
# 56

Podsumowując:

Funkcja append służy do dodawania pojedynczych elementów. Jej argumentem może być dowolny element, który zostanie dołożony do listy. W elemencie nie będzie żadnej zmiany struktury. Pamiętajmy, że możliwe jest dodanie nie tylko typów prostych (jak int, float, boolean), ale również złożonych jak inna lista, słownik czy obiekt.

Z kolei funkcja extend jest bardziej wybredna. Za argument przyjmie jedynie element, który jest iterowalny (iterable) np. listę, krotkę lub string. Jeśli podamy argument nieiterowalny np. int, dostaniemy błąd:

lista.extend(10)

# Odpowiedź interpretera:

Traceback (most recent call last):
File "", line 1, in
TypeError: 'int' object is not iterable

Pułapki

Ponieważ funkcja extend przyjmuje typy iterowalne, możemy bez protestów interpretera dodać do listy ciąg znaków, ale efekt może być zupełnie inny niż zamierzaliśmy...:


dziennik = ['Jan', 'Ania', 'Justyna', 'Tomek']

# dziennik
# ['Jan', 'Ania', 'Justyna', 'Tomek']

# dodajemy jeszcze jedno imię do dziennika:
dziennik.extend('Ola')

# dziennik
# ['Jan', 'Ania', 'Justyna', 'Tomek', 'O', 'l', 'a']

Nie o to nam przecież chodziło. Tutaj potrzebujemy użyć funkcji append:


dziennik = ['Jan', 'Ania', 'Justyna', 'Tomek']

# dziennik
# ['Jan', 'Ania', 'Justyna', 'Tomek']

dziennik.append('Ola')

# dziennik
# ['Jan', 'Ania', 'Justyna', 'Tomek', 'Ola']

Warto nauczyć się różnic w obsłudze extend i append na prostszych przykładach. Im dalej w las tym więcej drzew, a w bardziej skomplikowanych strukturach (np. dziennik z ocenami uczniów z różnych przedmiotów) odkrycie błędu może nam zająć więcej czasu.

Jeśli masz dodatkowe pytania lub własny przykład pomyłki z extend oraz append, pisz w komentarzach!

4 Komentarze

  1. Szkoda, że nastała tutaj taka cisza. Bardzo fajny blog ;)

    1. Justyna Kubisztal

      Już niedługo coś się pojawi :)

  1. Sławomir Maciejewski

    Zamiast dziennik.extend('Ola') trzeba by dać dziennik.extend(['Ola']) czyli argument zamieć na listę jeśli dobrze rozumiem i wtedy zadziała prawidłowo lub string "Ola" wcześniej przypisac do zmiennej.

    1. Justyna Kubisztal

      Dokładnie tak jak piszesz: dziennik.extend(['Ola'])

      Samo przypisanie do zmiennej nie pomoże, bo wciąż będzie ten sam typ, czyli stringi. Chyba, że wrzucisz to do listy: imie = ["Ola"]