Erros comuns do Python¶
A tabela cresce a cada capítulo. Quando algo der errado, procure aqui antes de procurar em qualquer outro lugar — a causa quase sempre está nesta lista.
Como ler uma mensagem de erro
De baixo para cima. A última linha diz o tipo do erro e o que aconteceu. Logo acima, a linha do seu programa em que ele apareceu — o número bate com o da margem do editor.
O Python moderno costuma sugerir a correção: Did you mean: ...? é o palpite dele, e o palpite quase sempre acerta.
A sua mensagem pode vir um pouco diferente
As mensagens deste material foram geradas rodando os programas de verdade, numa versão recente do Python. Versões diferentes escrevem o mesmo erro com palavras um pouco diferentes — a sugestão Did you mean: ...?, por exemplo, não aparece nas versões mais antigas.
O tipo do erro (NameError, TypeError, ValueError…) é o que não
muda, e é ele que identifica o problema. Se o texto da sua mensagem não
bater exatamente com o daqui, procure pelo tipo.
Capítulo 1 · Algoritmo e print¶
| Mensagem ou sintoma | Causa provável |
|---|---|
SyntaxError: unterminated string literal |
uma aspa abriu e não fechou |
SyntaxError: invalid syntax |
faltou um parêntese, ou sobrou |
NameError: name '...' is not defined |
nome digitado diferente do que existe — leia a sugestão |
| o texto saiu com aspas na tela | as aspas de fora ficaram dentro de outras aspas |
| a conta apareceu em vez do resultado | a conta está entre aspas, então virou texto |
| o programa roda mas faz outra coisa | as instruções estão na ordem errada |
Capítulo 5 · if e else¶
| Mensagem ou sintoma | Causa provável |
|---|---|
SyntaxError: ... Maybe you meant '==' or ':=' instead of '='? |
usou = (guardar) onde devia ser == (comparar) |
SyntaxError: expected ':' |
faltaram os dois-pontos no fim da linha do if ou do else |
IndentationError: expected an indented block after 'if' statement |
o if abriu e a linha de dentro não foi recuada |
IndentationError: unexpected indent |
uma linha ficou recuada sem if nenhum acima dela |
TabError: inconsistent use of tabs and spaces |
parte da indentação é Tab e parte é espaço; refaça só com espaços |
SyntaxError na linha do else |
else com condição, else sem if acima, ou fora da margem do if |
TypeError: '>' not supported between instances of 'str' and 'int' |
faltou int() ou float() em volta do input() |
NameError numa variável criada dentro do if |
o bloco não rodou, então ela nunca chegou a existir |
a linha de fora do if saiu junto com as de dentro |
ela está indentada sem querer |
| o valor da fronteira cai no lado errado | > onde devia ser >= (ou o contrário) |
duas contas com decimais deveriam ser iguais e == dá False |
comparação exata entre float; use >= / <= ou round |
| a função imprime a resposta certa e o teste falha | dentro da função, print no lugar de return |
Capítulo 6 · elif e operadores lógicos¶
| Mensagem ou sintoma | Causa provável |
|---|---|
SyntaxError: invalid syntax na linha do elif |
escreveu else if ou elseif; em Python é elif |
SyntaxError num elif que vem depois do else |
o else tem de ser o último da escada |
| o resultado é sempre o da última faixa | são if independentes; troque por elif |
um dos elif nunca acontece, para valor nenhum |
a ordem das faixas está invertida: um teste de cima já captura esses valores |
| um dos caminhos acontece sempre | or com valor solto — falta repetir variavel == do outro lado |
a condição com and e or misturados dá o contrário do esperado |
faltam parênteses separando as partes |
o else de dentro respondeu pelo if de fora |
erro de margem num if aninhado |
Os três erros da Unidade 2 não aparecem
Repare que metade das linhas das duas tabelas acima não tem mensagem
nenhuma: é sintoma, não erro. if no lugar de elif, faixa fora de ordem e
or com valor solto rodam limpo e entregam um resultado plausível.
A única defesa é a da Unidade 1: saber qual resposta esperar antes de rodar, e testar sempre os valores de fronteira de cada faixa.
Esta página acompanha o semestre
Cada capítulo acrescenta a sua seção aqui. Se o seu erro ainda não está listado, traga-o para a aula: ele provavelmente vale uma linha nova.
Capítulo 7 · while¶
| Mensagem ou sintoma | Causa provável |
|---|---|
| o programa não para e a tela enche | laço infinito: falta o avanço da variável do teste |
| o programa não para e nada aparece | laço infinito sem print — pare com Stop (ou Ctrl+C) |
| o total é igual à última parcela | o acumulador foi zerado dentro do laço |
| o total deu zero | a linha que soma ficou fora do bloco indentado |
| o laço deu uma volta a mais ou a menos | < onde devia ser <=, ou vice-versa |
IndentationError: expected an indented block after 'while' statement |
faltou indentar o corpo do laço |
NameError logo na primeira volta |
a variável do teste não foi criada antes do while |
| a sentinela entrou na soma | o valor é somado antes de a condição ser testada |
| a sentinela nunca encerra o laço | falta o segundo input(), no fim do bloco |
Capítulo 8 · for e range¶
| Mensagem ou sintoma | Causa provável |
|---|---|
| o laço deu uma volta a menos | range(1, n) em vez de range(1, n + 1) |
| a contagem começou em 0 e você queria 1 | range(n) em vez de range(1, n + 1) |
| o laço não fez nada e não deu erro | range(0), ou um range cujo fim é menor que o início |
TypeError: 'float' object cannot be interpreted as an integer |
passou um decimal ao range |
TypeError: 'str' object cannot be interpreted as an integer |
faltou int() no valor lido do teclado |
| o total aparece várias vezes na tela | o print está indentado, dentro do laço |
| o contador contou todas as voltas | o + 1 ficou fora do if |
IndentationError: expected an indented block after 'for' statement |
faltou indentar o corpo do laço |