Anexar vira minha lista para o NoneType
Pergunta
No Python Shell, entrei:
aList = ['a', 'b', 'c', 'd']
for i in aList:
print(i)
e pegou
a
b
c
d
Mas quando eu tentei:
aList = ['a', 'b', 'c', 'd']
aList = aList.append('e')
for i in aList:
print(i)
e pegou
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
for i in aList:
TypeError: 'NoneType' object is not iterable
Alguém sabe o que está acontecendo? Como posso consertar/contornar isso?
Solução
list.append
é um método que modifica a lista existente. Não retorna uma nova lista - ele retorna None
, como a maioria dos métodos que modificam a lista. Simplesmente faça aList.append('e')
E sua lista será anexada o elemento.
Outras dicas
Geralmente, o que você deseja é a resposta aceita. Mas se você deseja o comportamento de substituir o valor e criar uma nova lista (que é razoável em alguns casos^), o que você poderia fazer é usar o "operador de splat", também conhecido como List Desepping:
aList = [*aList, 'e']
#: ['a', 'b', 'c', 'd', 'e']
Ou, se você precisar apoiar o Python 2, use o +
operador:
aList = aList + ['e']
#: ['a', 'b', 'c', 'd', 'e']
^ Existem muitos casos em que você deseja evitar os efeitos colaterais de mutações com .append()
. Por um lado, imagine que você deseja anexar algo a uma lista que você fez como argumento de função. Quem estiver usando a função provavelmente não espera que a lista que eles forneçam seja alterada. Usar algo assim mantém sua função "puro" sem "efeitos colaterais".
Exclua sua segunda linha aList = aList.append('e')
e use apenas aList.append("e")
, isso deve se livrar desse problema.