Python è uno dei linguaggi di programmazione più amati al mondo. È considerato semplice, intuitivo, perfetto per chi inizia. Eppure, anche con Python, dopo poche righe di codice… arrivano loro: gli errori. Chiunque abbia programmato almeno una volta in vita sua conosce quella sensazione: lanci il tuo script, ti aspetti che funzioni alla perfezione e invece sullo schermo appare una riga rossa minacciosa. Errori incomprensibili, sigle strane, termini criptici. La verità, però, è che gli errori non sono il nemico. Sono guide, messaggi che Python ci manda per dirci esattamente dove abbiamo sbagliato. Se impariamo a leggerli con calma, diventano i nostri migliori alleati. In questo articolo vedremo insieme i 10 errori più comuni in Python, capiremo cosa significano, perché compaiono e soprattutto come risolverli. Alla fine avrai un vero e proprio “vocabolario degli errori”, pronto da consultare ogni volta che il tuo codice si ferma.
Errori di Sintassi e di Indentazione in Python
Quando si inizia a programmare in Python, è praticamente impossibile non imbattersi presto in due tipi di errori molto frequenti: gli errori di sintassi (SyntaxError) e gli errori di indentazione (IndentationError). Sono i primi a comparire sul nostro schermo quando qualcosa “non torna” nel codice, e anche se possono sembrare misteriosi, in realtà sono ottimi alleati: ci segnalano esattamente dove abbiamo sbagliato.
SyntaxError – L’Errore di Sintassi
Il SyntaxError è l’errore più comune, il più famoso e quasi sicuramente il primo che incontrerai nel tuo viaggio con Python. Compare ogni volta che scrivi qualcosa che non rispetta le regole grammaticali del linguaggio, un po’ come fare un errore di ortografia in una frase in italiano.
Esempio classico:
print("Ciao"
Messaggio di errore:
SyntaxError: unexpected EOF while parsing
Cosa significa? Significa che Python si aspettava di trovare ancora qualcosa — magari una parentesi di chiusura, un’apice, un due punti o una virgola — ma il codice è finito prima del previsto. In altre parole, il parser di Python (cioè il componente che legge e interpreta il codice) si è fermato perché ha trovato una “frase” incompleta.
Come risolvere un SyntaxError
- Controlla la punteggiatura del codice: verifica sempre che tutte le parentesi tonde, quadre o graffe siano aperte e chiuse correttamente, e che le stringhe abbiano sia l’apertura che la chiusura con le virgolette.
- Usa un editor con evidenziazione della sintassi: oggi quasi tutti gli editor colorano il codice in base al suo significato. Se qualcosa non è colorato nel modo giusto, è spesso il segnale che manca una parentesi o una virgolette.
- Leggi con calma il messaggio di errore: anche se può sembrare criptico, Python ti indica sempre la riga esatta in cui si è bloccato e spesso anche una breve descrizione del problema. Basta seguirne le tracce per capire dov’è il punto critico.
IndentationError – L’Errore di Indentazione
Python è un linguaggio elegante e leggibile, ma ha una particolarità: l’indentazione non è solo una questione estetica, è parte integrante della sintassi! In molti altri linguaggi, come C o Java, l’indentazione serve solo per rendere il codice più ordinato. In Python, invece, essa definisce la struttura logica dei blocchi di codice.
Esempio:
def saluta():
print("Ciao")
Messaggio di errore:
IndentationError: expected an indented block
Cosa succede qui?
Dopo aver definito la funzione saluta(), Python si aspettava di trovare un
blocco di istruzioni indentato, cioè rientrato di qualche spazio. Siccome la
riga print("Ciao") è allineata al margine sinistro, il linguaggio non riesce
a capire che fa parte della funzione — e quindi si lamenta.
Come risolvere un IndentationError
- Sii coerente con l’indentazione: decidi se usare spazi o tabulazioni e mantieni sempre la stessa scelta in tutto il file. La convenzione più diffusa (e raccomandata) è 4 spazi per ogni livello di rientro.
- Verifica tutti i blocchi di controllo: ogni costrutto come
if,for,while,defoclassdeve sempre avere un blocco di codice indentato al suo interno. - Ricorda il principio chiave: in Python l’indentazione non serve solo a fare bello il codice — serve a dare un senso logico al programma. È ciò che permette al linguaggio di capire dove inizia e dove finisce un’istruzione, una funzione o un ciclo.
In sintesi
Gli errori di sintassi e di indentazione sono i “primi maestri” del programmatore Python: sembrano ostacoli, ma in realtà ci insegnano a scrivere codice più chiaro, ordinato e leggibile. Ogni volta che li incontri, non scoraggiarti: leggili come un messaggio che ti guida verso una forma di pensiero più rigorosa e precisa. In fondo, Python è un linguaggio che premia la chiarezza mentale tanto quanto la precisione tecnica.
Errori di Sintassi e di Indentazione
Ogni linguaggio di programmazione ha le proprie regole grammaticali, e Python non fa eccezione. Quando scriviamo codice, comunichiamo con un interprete che si aspetta istruzioni precise, coerenti e ben formattate. Basta una parentesi mancante, una riga mal allineata o una parola fuori posto perché Python si fermi e ci segnali un errore.
Tra i primi ostacoli che si incontrano imparando a programmare ci sono proprio gli errori di sintassi e gli errori di indentazione. Il loro compito è avvisarci che qualcosa, nel modo in cui abbiamo scritto il codice, non rispetta la struttura che Python si aspetta.
Anziché considerarli nemici, è utile pensarli come strumenti di apprendimento: ci costringono a scrivere in modo più ordinato, preciso e leggibile. Capire come leggerli e risolverli è il primo passo per diventare programmatori più consapevoli e autonomi.
NameError – Quando il nome non esiste
Il NameError si verifica ogni volta che provi a usare una variabile o un identificatore che Python non conosce, cioè che non è stato ancora definito nel contesto in cui ti trovi. È come pronunciare il nome di qualcuno in una stanza in cui quella persona non c’è: il linguaggio si ferma e ti avvisa che non ha idea di cosa tu stia parlando.
Esempio:
print(nome)
Messaggio di errore:
NameError: name 'nome' is not defined
In questo caso, stai chiedendo a Python di stampare il valore della variabile
nome, ma tale variabile non è mai stata creata. Il linguaggio, giustamente,
non può inventarsi un valore e segnala l’errore.
Come risolvere:
- Assicurati che la variabile sia stata definita prima di utilizzarla. Se la stai creando dentro una funzione o un blocco, verifica che sia accessibile da dove la richiami.
- Fai attenzione agli errori di battitura: in Python le variabili sono
sensibili alle maiuscole e alle minuscole, quindi
nomeeNomesono due nomi diversi. - Se non sei sicuro di cosa sia già presente in memoria, puoi usare funzioni
utili come
dir()oglobals()per elencare tutte le variabili e gli oggetti attualmente definiti.
TypeError – Quando i tipi non si capiscono
Il TypeError compare quando cerchi di combinare o manipolare oggetti di tipi incompatibili. È un errore che segnala un’incomprensione logica tra le entità che stai cercando di far interagire: ad esempio, un numero e una stringa non possono essere sommati direttamente, perché Python non sa come interpretare quella richiesta.
Esempio:
numero = 5
testo = "ciao"
print(numero + testo)
Messaggio di errore:
TypeError: unsupported operand type(s) for +: 'int' and 'str'
In questo caso, l’operatore + funziona perfettamente sia tra numeri (dove
indica una somma), sia tra stringhe (dove indica una concatenazione). Tuttavia,
quando provi ad applicarlo a un numero e a una stringa insieme, Python non sa
quale comportamento scegliere e genera l’errore.
Come risolvere:
Effettua conversioni esplicite tra tipi quando necessario. Ad esempio, se vuoi unire un numero a una stringa, puoi scrivere:
print(str(numero) + testo)
In questo modo dici chiaramente a Python che vuoi trasformare il numero in testo prima di concatenarlo.
- Usa la funzione
type()per verificare il tipo di una variabile e capire se stai operando con i tipi corretti. - Ricorda che Python non tenta di “indovinare” le tue intenzioni: se vuoi combinare tipi diversi, devi essere tu a indicargli come farlo.
ValueError – Quando il valore non ha senso
Il ValueError è strettamente imparentato con il TypeError, ma la causa è diversa. Qui il tipo di dato è corretto, ma il valore contenuto non è adatto all’operazione richiesta. È come se dicessi a Python: “trasforma questa parola in un numero”. Il linguaggio ti risponde che non può farlo, non perché il tipo sia sbagliato, ma perché il valore non è interpretabile come numero.
Esempio:
int("ciao")
Messaggio di errore:
ValueError: invalid literal for int() with base 10: 'ciao'
Il tipo di dato di partenza è corretto (una stringa), e la funzione int() sa
come gestire stringhe che rappresentano numeri, ma in questo caso la parola
“ciao” non è un numero valido. Python, coerentemente, solleva un ValueError.
Come risolvere:
Verifica sempre che i dati abbiano il formato corretto prima di convertirli o elaborarli.
Quando i dati provengono da input esterni, come quelli inseriti dall’utente o letti da un file, è buona pratica gestire le eccezioni con un blocco
try/except. In questo modo puoi intercettare l’errore ed evitare che il programma si interrompa:try: numero = int("ciao") except ValueError: print("Impossibile convertire in intero")
In questo modo il programma continua a funzionare anche se i dati non sono nel formato previsto.
Errori su Liste e Dizionari
Dopo aver preso dimestichezza con le basi della sintassi, uno degli ostacoli più frequenti per chi programma in Python riguarda le strutture dati, in particolare liste e dizionari. Questi strumenti sono potenti e flessibili, ma proprio per questo è facile commettere errori se non si ha ancora chiaro come funzionano gli indici e le chiavi. Python è molto preciso nel segnalare quando si tenta di accedere a un elemento che non esiste: in quei casi ci restituisce errori come IndexError o KeyError. Imparare a riconoscerli e a interpretarli è fondamentale per gestire in modo sicuro e consapevole i dati in memoria.
IndexError – Quando l’indice non esiste
L’IndexError si verifica ogni volta che provi ad accedere a una posizione
che non esiste all’interno di una lista, di una tupla o di una
stringa. Python numerando gli elementi a partire da zero, considera valida
solo una gamma di indici che va da 0 al numero di elementi meno uno. Se provi
a usare un indice fuori da questi limiti, il linguaggio non può restituirti
alcun valore e genera l’errore.
Esempio:
lista = [1, 2, 3]
print(lista[5])
Messaggio di errore:
IndexError: list index out of range
In questo caso, la lista contiene tre elementi (con indici 0, 1 e 2), ma il codice tenta di accedere all’indice 5, che non esiste. Python lo segnala chiaramente con il messaggio “index out of range”.
Come risolvere:
Controlla sempre la lunghezza della lista con la funzione
len(), ad esempiolen(lista), prima di accedere a un indice variabile.Ricorda che gli indici partono da 0: il primo elemento non è
[1], ma[0].Quando possibile, evita di accedere manualmente agli indici e preferisci cicli o operazioni di slicing, che riducono il rischio di errori. Ad esempio:
for elemento in lista: print(elemento)
oppure
print(lista[:3])
In questo modo Python gestisce automaticamente i limiti della sequenza.
KeyError – Quando la chiave non è presente
Il KeyError si manifesta quando cerchi di accedere a una chiave che non esiste all’interno di un dizionario. A differenza delle liste, che usano indici numerici, i dizionari associano a ogni valore una chiave univoca. Se provi a interrogare il dizionario con una chiave che non è stata definita, Python non sa cosa restituire e solleva un errore.
Esempio:
diz = {"nome": "Luca"}
print(diz["eta"])
Messaggio di errore:
KeyError: 'eta'
Il dizionario diz contiene solo una chiave, "nome", ma il codice tenta di
accedere a "eta", che non è presente. Python interrompe l’esecuzione e
segnala chiaramente quale chiave manca.
Come risolvere:
Usa il metodo
.get()per accedere in modo sicuro a una chiave, specificando un valore di default da restituire nel caso in cui la chiave non esista. Ad esempio:print(diz.get("eta", "Chiave non trovata"))
In questo modo il programma non genera un errore, ma restituisce un messaggio alternativo.
Prima di accedere a una chiave, puoi verificare la sua presenza con un semplice controllo:
if "eta" in diz: print(diz["eta"])
Questo approccio evita interruzioni e rende il codice più robusto.
Errori su Oggetti e Moduli
Man mano che si procede nello studio di Python, ci si imbatte in un altro gruppo di errori legati non più alla sintassi o ai dati, ma al modo in cui utilizziamo gli oggetti e i moduli. Python è un linguaggio orientato agli oggetti: ogni elemento — che sia un numero, una stringa, una lista o un dizionario — appartiene a una precisa classe e possiede attributi e metodi specifici. Se tentiamo di accedere a un metodo che quell’oggetto non ha, o se proviamo a importare un modulo che non esiste, il linguaggio reagisce segnalando un errore. Questi errori, apparentemente tecnici, sono in realtà preziosi indizi che ci aiutano a capire meglio la struttura interna del linguaggio e la logica degli oggetti che lo compongono.
AttributeError – Quando un oggetto non ha ciò che cerchi
Un AttributeError si verifica quando tenti di usare un metodo o un attributo che non esiste per il tipo di oggetto su cui stai lavorando. Ogni oggetto in Python ha un insieme definito di funzioni e proprietà. Se provi a richiamarne una che non fa parte di quel tipo, Python ti ferma con un messaggio di errore.
Esempio:
numero = 10
numero.append(5)
Messaggio di errore:
AttributeError: 'int' object has no attribute 'append'
Qui il problema è chiaro: il metodo append() è valido per le liste, ma
non per gli interi. L’oggetto numero è di tipo int, e quindi non
possiede un metodo con quel nome.
Come risolvere:
Usa la funzione
type()per verificare di che tipo è l’oggetto su cui stai lavorando. Ad esempio:print(type(numero))
ti aiuterà a capire se stai operando sull’oggetto giusto.
Consulta la documentazione ufficiale o l’aiuto integrato con
help()per conoscere quali metodi e attributi appartengono a quel tipo di oggetto.Ricorda che non tutti gli oggetti possiedono gli stessi metodi: un numero, una stringa o una lista possono sembrare simili in alcuni comportamenti, ma ognuno di essi ha funzionalità diverse.
ImportError e ModuleNotFoundError – Quando il modulo non si trova
Gli errori ImportError e ModuleNotFoundError si presentano quando provi
a importare un modulo che non esiste, non è installato oppure non è
accessibile nel contesto corrente. In Python, ogni volta che scriviamo
import, chiediamo al linguaggio di cercare un modulo esterno da caricare in
memoria. Se il nome è sbagliato o il pacchetto non è disponibile,
l’importazione fallisce.
Esempio:
import panda
Messaggio di errore:
ModuleNotFoundError: No module named 'panda'
In questo caso, l’errore è dovuto a un semplice errore di battitura: il modulo corretto si chiama pandas, non panda. Python, non trovando alcun pacchetto con quel nome, solleva l’eccezione.
Come risolvere:
Verifica sempre l’ortografia del nome del modulo. Anche una sola lettera sbagliata può impedire l’importazione.
Se il modulo non è installato, puoi aggiungerlo al tuo ambiente con il comando:
pip install pandas(sostituendo “pandas” con il nome del modulo desiderato).
Se lavori con ambienti virtuali, assicurati che il modulo sia installato nell’ambiente corretto. È possibile che un pacchetto installato globalmente non sia disponibile all’interno di un ambiente isolato, o viceversa.
Divisioni Impossibili
Tra tutti gli errori che possono verificarsi in un programma, ce n’è uno che accomuna principianti e professionisti: la divisione per zero. In matematica, dividere un numero per zero è un’operazione priva di significato — e Python, coerentemente, si rifiuta di eseguirla. Quando ciò accade, il linguaggio genera un errore specifico: ZeroDivisionError. Si tratta di un errore semplice da capire, ma che può comparire facilmente, soprattutto quando i valori coinvolti nella divisione provengono da input esterni o da calcoli complessi.
Il ZeroDivisionError viene sollevato quando tenti di eseguire un’operazione di divisione in cui il divisore è uguale a zero. Python, come qualsiasi sistema logico, non può rappresentare il risultato di una divisione per zero e quindi interrompe l’esecuzione segnalando l’errore.
Esempio:
x = 10 / 0
Messaggio di errore:
ZeroDivisionError: division by zero
In questo caso, il programma tenta di calcolare 10 / 0, ma la divisione non è
matematicamente definita, e l’interprete interrompe l’esecuzione per evitare un
risultato privo di senso.
Come risolvere:
Aggiungi sempre un controllo sul denominatore prima di effettuare la divisione. Ad esempio:
if y != 0: print(x / y) else: print("Divisione per zero non consentita")
In questo modo il programma verifica la validità dell’operazione prima di eseguirla.
Se i valori derivano da input esterni o da calcoli intermedi, può essere utile gestire la situazione anche con un blocco
try/except, per esempio:try: risultato = x / y except ZeroDivisionError: print("Errore: impossibile dividere per zero")
In questo modo l’errore non blocca il programma e può essere gestito in modo elegante.
Conclusione
Ora che hai fatto un giro panoramico tra i principali errori di Python, la domanda naturale è: cosa fare, concretamente, quando sullo schermo compare un errore? Invece di viverlo come un fallimento, puoi trattarlo come un messaggio strutturato che ti indica esattamente dove guardare. Ecco una piccola guida operativa per affrontarli con metodo.
Leggi il messaggio per intero Non fermarti alla prima riga né limitarti a pensare “non funziona”. Il messaggio di errore contiene almeno due informazioni fondamentali:
- il tipo di errore (ad esempio
SyntaxError,TypeError,IndexError…), - la riga di codice in cui l’interprete si è fermato. Spesso, subito sotto, trovi anche una freccia che indica il punto approssimativo in cui il parser ha avuto problemi. Prenditi il tempo per leggere tutto: alcune volte la soluzione è letteralmente scritta lì.
- il tipo di errore (ad esempio
Non andare nel panico Gli errori non sono un segnale che “non sei portato”, ma la condizione normale di chi programma. Qualsiasi sviluppatore, a qualsiasi livello, vede errori ogni giorno. La differenza non sta nel non sbagliare, ma nel non farsi bloccare: l’errore è un feedback, non un giudizio.
Osserva il comportamento del programma: print e debugger Se non capisci subito dov’è il problema, prova a “illuminare” il flusso del codice:
- inserisci
print()strategici per vedere il contenuto delle variabili nei punti chiave, - oppure usa un debugger per eseguire il programma passo per passo, controllando a ogni step cosa succede. Questo ti permette di passare da “non funziona” a “in questo punto succede qualcosa di diverso da quello che mi aspettavo”.
- inserisci
Cerca online in modo mirato Se l’errore continua a non essere chiaro, non esitare a cercare il messaggio esatto su Internet. Spesso basta copiare e incollare la riga di errore (magari aggiungendo “python” alla ricerca) per trovare discussioni e soluzioni su siti come Stack Overflow. È importante però non limitarsi a copiare la soluzione: leggi la spiegazione e prova a capire perché quella modifica risolve il problema.
Impara qualcosa da ogni errore Ogni volta che correggi un errore, chiediti: “Come faccio a evitare lo stesso errore la prossima volta?” Con il tempo, inizierai a riconoscere i pattern: saprai che un certo tipo di messaggio indica quasi sempre una parentesi mancante, una variabile non definita, un indice fuori range e così via. Più errori incontri, più diventi rapido nel prevederli e prevenirli.
Ogni errore in Python può essere visto come un insegnante severo ma imparziale: non ti lascia passare nulla, ma ti indica con precisione dove qualcosa non torna. La vera svolta sta nel cambiare prospettiva: smettere di considerarli ostacoli personali e iniziare a leggerli come suggerimenti tecnici. Un programmatore esperto non è qualcuno che non sbaglia mai, ma qualcuno che ha imparato a leggere, interpretare e risolvere gli errori in tempi brevi, trasformandoli in informazioni utili.
In conclusione, gli errori in Python non sono una punizione, ma una forma di
comunicazione che il linguaggio usa per dialogare con te. Dal SyntaxError al
ZeroDivisionError, ogni messaggio contiene indizi preziosi per rendere il tuo
codice più preciso, robusto e leggibile. La prossima volta che vedi comparire
una riga rossa sullo schermo, resisti alla tentazione di irritarti: fermati un
momento, leggi con calma, ragiona su ciò che il linguaggio ti sta dicendo.
Quello che oggi ti appare come un ostacolo è, in realtà, un invito a
migliorare. E, in fondo, ogni bug risolto è davvero un livello in più
nella tua crescita come programmatore.