Python • kurs podstawowy • lekcja 18
Listy
Lista przechowuje elementy w kolejności i pozwala je zmieniać.
Twój cel: Zmienisz listę, odczytasz element i rozpoznasz współdzielenie tej samej listy.Indeksy, pętla for i enumerate().
Od potrzeby do kodu
Indeksy zaczynają się od 0, tak jak w napisach. len(items) daje długość. Dla niepustej listy ostatni nieujemny indeks to len(items) - 1; dla pustej listy taki element nie istnieje.
items.append(value) dodaje na końcu. items.remove(value) usuwa pierwsze wystąpienie wartości, a nie element o podanym indeksie. Jeśli wartości nie ma, zgłosi ValueError. Przypisanie items[0] = value zastępuje pierwszy element. for item in items pobiera kolejne wartości.
Lista jest mutowalna. other = items nie tworzy drugiej listy: obie nazwy wskazują tę samą. Dlatego append jest widoczne przez obie nazwy. items.copy() tworzy nową listę z tymi samymi elementami; przy listach zagnieżdżonych nie kopiuje automatycznie ich wnętrza. append zmienia listę i zwraca None.
Przewidź przed uruchomieniem
items = ["chleb", "mleko"]
other = items
items.append("ser")
items.remove("mleko")
print(other)
print(items[1])
Porównaj wynik i prześledź mechanizm
['chleb', 'ser'] oraz ser. other i items wskazują tę samą listę, więc obie nazwy widzą zmiany. Po usunięciu mleka ser ma indeks 1.
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
['chleb', 'ser']
ser
| Stan | Indeks 0 | Indeks 1 | Indeks 2 |
|---|---|---|---|
| Początek | chleb | mleko | brak |
| Po append | chleb | mleko | ser |
| Po remove | chleb | ser | brak |
Zmień działający program
Zamiast other = items użyj items.copy(). Po dodaniu sera porównaj listę oryginalną z kopią.
Pierwsza wskazówka
Zachowaj działający punkt wyjścia. Zlokalizuj konstrukcję wskazaną w poleceniu i zmień tylko ten etap. Przed uruchomieniem zapisz oczekiwany efekt.
Porównaj swoją modyfikację
items = ["chleb", "mleko"]
other = items.copy()
items.append("ser")
print(items)
print(other)
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
['chleb', 'mleko', 'ser']
['chleb', 'mleko']
Znajdź przyczynę problemu
Celowo błędny przykład diagnostyczny. Najpierw postaw hipotezę. Nie kopiuj tej wersji jako poprawnego rozwiązania.
Zamierzone działanie: Dodaj ser, zachowując listę pod nazwą items.
items = ["chleb"]
items = items.append("ser")
print(items)
Trop do diagnozy
Porównaj zamierzony rezultat z typami, nazwami i kolejnością instrukcji. Wskaż pierwsze miejsce, w którym zachowanie odbiega od celu.
Zastosuj w nowej sytuacji
Wskazówka do rozpoczęcia
Odróżniaj zmianę listy od przypisania nazwy. Indeks oznacza pozycję, remove otrzymuje wartość.
Zacznij od przygotowania danych. Pierwsza instrukcja przykładowego rozwiązania:
tasks = ["czytać", "rysować"]
Rozwiązanie do samodzielnej kontroli
tasks = ["czytać", "rysować"]
tasks[0] = "liczyć"
tasks.append("spacer")
for number, task in enumerate(tasks, start=1):
print(number, task)
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
1 liczyć
2 rysować
3 spacer
Porównaj dane wejściowe, wynik i powód użycia konstrukcji. Inna wersja kodu jest poprawna, jeśli realizuje te same wymagania.
Co zabierasz do kolejnego programu?
Odróżniaj zmianę listy od przypisania nazwy. Indeks oznacza pozycję, remove otrzymuje wartość.
Bez zaglądania do przykładu wyjaśnij własnymi słowami, jak główna konstrukcja prowadzi od danych do wyniku. Potem sprawdź wyjaśnienie, uruchamiając swój program.