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