segunda-feira, 18 de janeiro de 2010

Equívocos I

Sempre que corrigimos exames encontramos muitos erros, alguns muito básicos outros mais sofisticados. Fazer uma colectânea com os mais comuns, procurando explicar onde está o erro parece ser uma boa ideia. Tenho dúvidas se será muito pedagógico. Mas enquanto não me decido sobre esta metafísica questão indico aqui um ou outro. Estou aberto a que me enviem as vossas dúvidas sobre outras situações, que procurarei igualmente clarificar.

Coisas com listas

Um erro típico é tentar aceder a uma parte da lista que não existe, recebendo um erro do género IndexError: list assignment index out of range. Se uma lista tem, por exemplo, 5 objectos e perguntamos pelo objecto na posição 7 ... lá temos o erro. Mas pode ser mais subtil. Olhemos para o código:

x = []
for i in range(5):
x[i] = i

O erro é exactamente o mesmo. Acontece que a lista x não tem nenhum valor quando tentamos lá colocar algo. Mesmo que seja na posição 0. É que esta não existe numa lista vazia!! No exemplo acima, uma maneira de resolver a questão seria usar listas por compreensão:


x = [ i for i in range(5)]

Assim fabricamos os elementos, e colocamos depois tudo numa lista.

Outra questão prende-se com o facto de as listas serem objectos mutáveis. Assim podemos substituir o seu valor sem alterar a sua identidade. Existem muitos métodos que se podem aplicar a listas. Alguns têm por objectivo alterar o objecto. Não têm que devolver nada. Mas em Python, quando não há um return explícito no código, é devolvido o objecto None. Exemplo de um erro comum, por não saberem o que isto significa.

x = []
for i in range(5):
x= x.append(i)

print x

Executar o código acima resulta no erro AttributeError: 'NoneType' object has no attribute 'append'. Porquê? Precisamente porque na primeira passagem no interior do ciclo, x.append(i) coloca 0 na lista x, mas depois devolve None, valor esse que é associado ao mesmo objecto x pela instrução de atribuição (x = ...), desfazendo a anterior ligação ao objecto lista. Como resultado, na segunda passagem pelo ciclo temos um erro pois x está agora associado a um objecto do tipo None, que não possui nenhum método append.

Sem comentários:

Enviar um comentário