Wszystkie artykuły
Nauka programowania od podstaw

Najczęstsze błędy w Pythonie u początkujących: co oznaczają komunikaty i jak je poprawić

SyntaxError, IndentationError, NameError, ValueError, TypeError i IndexError na prostych przykładach. Dowiedz się, jak czytać komunikat błędu i szybko znaleźć przyczynę.

12 października 202610 min

Jak czytać komunikat błędu (traceback)

Gdy program się wysypuje, Python wypisuje tzw. traceback. Na początku wygląda groźnie, ale ma prostą budowę: wyżej jest ścieżka wywołań, a na samym dole nazwa błędu i krótki opis. Zawsze zaczynaj czytanie od ostatniej linii.

Druga ważna informacja to numer linii (line 3, line 7 itd.). To miejsce, w którym Python zauważył problem. Przyczyna bywa linię wcześniej — na przykład niezamknięty nawias w linii 2 daje błąd zgłoszony w linii 3.

Jeśli uruchamiasz kod w interpreterze Pythona w przeglądarce, pod wynikiem dla kilku najczęstszych błędów pojawi się dodatkowo krótka wskazówka po polsku. Poniżej znajdziesz te same błędy rozpisane dokładniej.

Błędy, które zobaczysz najczęściej

SyntaxError — Python nie rozumie zapisu

To błąd składni: kod nie jest poprawnym Pythonem, więc program w ogóle się nie uruchamia. Najczęstsze przyczyny to brak dwukropka po if, for, while lub def, niezamknięty nawias albo cudzysłów oraz użycie = zamiast == w warunku.

python
wiek = 17

# Błąd: brak dwukropka i = zamiast ==
# if wiek = 18
#     print('Pełnoletni')

# Poprawnie:
if wiek == 18:
    print('Pełnoletni')

Sprawdź wskazaną linię i tę przed nią: dwukropki, nawiasy, cudzysłowy. Edytor z podświetlaniem składni często pokazuje problem kolorem.

IndentationError — niespójne wcięcia

W Pythonie wcięcia wyznaczają bloki kodu. Linie wewnątrz tego samego if albo pętli muszą mieć identyczne wcięcie, a po linii zakończonej dwukropkiem musi pojawić się wcięty blok. Mieszanie spacji i tabulatorów kończy się błędem TabError.

python
for i in range(3):
    print('Linia', i)
    print('Ta sama pętla')   # 4 spacje, tak jak wyżej
print('Po pętli')            # bez wcięcia = poza pętlą

Przyjmij jedną zasadę: 4 spacje na poziom wcięcia. Większość edytorów wstawia je automatycznie po wciśnięciu Tab.

NameError — nazwa nie została zdefiniowana

Python nie zna nazwy, której użyłeś. Zwykle to literówka (wynk zamiast wynik), różnica w wielkości liter (Print zamiast print) albo użycie zmiennej, zanim przypisano jej wartość. Zdarza się też, gdy tekst nie jest ujęty w cudzysłów.

python
imie = 'Ola'
# print(Imie)   # NameError: name 'Imie' is not defined
print(imie)

# print(Ala)    # NameError — bez cudzysłowu to nazwa zmiennej
print('Ala')

ValueError — zła wartość, np. przy int(input())

Klasyka pierwszych programów: int(input()) dostaje tekst, którego nie da się zamienić na liczbę całkowitą, na przykład '2,5', 'dwa' albo pusty napis. Komunikat zaczyna się wtedy od invalid literal for int().

Rozwiązania są dwa: wpisuj liczbę w poprawnym formacie albo zabezpiecz program, sprawdzając dane przed konwersją.

python
tekst = input('Podaj liczbę całkowitą: ')

if tekst.strip().lstrip('-').isdigit():
    liczba = int(tekst)
    print('Podwojona:', liczba * 2)
else:
    print('To nie jest liczba całkowita:', tekst)

Dla liczb z przecinkiem użyj float(), pamiętając, że Python oczekuje kropki: 2.5, a nie 2,5.

TypeError — operacja na niepasujących typach

Najczęściej pojawia się przy łączeniu tekstu z liczbą. input() zawsze zwraca tekst, więc '5' + 3 nie zadziała. Trzeba zdecydować, czy chcesz liczyć (zamień tekst na liczbę), czy sklejać napisy (zamień liczbę na tekst albo użyj f-stringa).

python
punkty = 12
# print('Masz ' + punkty + ' punktów')   # TypeError
print('Masz ' + str(punkty) + ' punktów')
print(f'Masz {punkty} punktów')         # czytelniej

IndexError — indeks poza listą

Lista o długości 3 ma indeksy 0, 1 i 2. Odwołanie do elementu [3] kończy się błędem list index out of range. Często winna jest pętla z range(len(lista) + 1) albo założenie, że numeracja zaczyna się od 1.

python
oceny = [4, 5, 3]
print(oceny[0], oceny[-1])   # pierwszy i ostatni element

for ocena in oceny:          # bez indeksów nie ma ryzyka
    print(ocena)

Nawyki, które skracają szukanie błędów

Nie musisz zapamiętywać wszystkich typów wyjątków. Ważniejsze jest kilka prostych nawyków, które sprawiają, że błąd znajdziesz w minutę, a nie w pół godziny.

  • Uruchamiaj program często — po każdych kilku liniach, a nie dopiero po napisaniu całości.
  • Dodawaj tymczasowe print(), żeby zobaczyć, jakie wartości mają zmienne w danym momencie.
  • Czytaj komunikat od dołu i zaczynaj od wskazanej linii oraz tej przed nią.
  • Gdy nie rozumiesz komunikatu, skopiuj jego ostatnią linię i poszukaj jej dosłownie — ktoś na pewno miał ten sam problem.
  • Upraszczaj: zakomentuj część kodu i sprawdź, przy którym fragmencie błąd znika.

Gdzie to przećwiczyć

Najlepiej uczyć się na własnych błędach. Weź przykłady z tego artykułu, celowo je zepsuj i zobacz, jaki komunikat wypisze Python. Możesz to zrobić od razu w edytorze Pythona online, bez instalowania czegokolwiek.

Kiedy podstawy będą już pewne, sięgnij po zadania z automatycznym sprawdzaniem. Testy pokażą nie tylko błędy w składni, ale też sytuacje, w których program działa, a mimo to daje zły wynik — to kolejny ważny etap nauki debugowania.

Krótkie podsumowanie

Komunikat błędu to podpowiedź, a nie wyrok. Czytaj go od dołu: ostatnia linia mówi, co się stało, a numer linii pokazuje, gdzie szukać. Większość błędów na początku to literówki, brakujące dwukropki, niespójne wcięcia i pomylone typy danych — po kilku tygodniach rozpoznasz je w kilka sekund.

Zacznij za darmo