2010-10-01 15 views
13

En Python Shell, entré:Anexión convierte mi lista para NoneType

aList = ['a', 'b', 'c', 'd'] 
for i in aList: 
    print(i) 

y me

a 
b 
c 
d 

pero cuando intenté:

aList = ['a', 'b', 'c', 'd'] 
aList = aList.append('e') 
for i in aList: 
    print(i) 

y me

Traceback (most recent call last): 
    File "<pyshell#22>", line 1, in <module> 
    for i in aList: 
TypeError: 'NoneType' object is not iterable 

¿Alguien sabe lo que está pasando? ¿Cómo puedo solucionarlo?

Respuesta

25

list.append es un método que modifica la lista existente. No devuelve una nueva lista: devuelve None, como la mayoría de los métodos que modifican la lista. Simplemente haz aList.append('e') y tu lista tendrá el elemento adjunto.

+0

Y como no devuelve nada, configurará una lista como Ninguna si realiza la tarea, por lo que recibirá el error. – kindall

+0

Todas las funciones devuelven algo :) –

+1

cierto - pero a veces ese * algo * es 'Ninguno'. Pero, ¿'Nada' realmente es algo? ¡Me duele la cabeza! –

2

Borre su segunda línea aList = aList.append('e') y use solamente aList.append("e"), esto debería deshacerse de ese problema.

0

En general, lo que quiere es la respuesta aceptada. Sin embargo, si desea que el comportamiento de sustituir el valor y la creación de una nueva lista (que es razonable en algunos casos ^), lo que podría hacer en su lugar es utilizar el "operador splat", también conocida como la lista de desempaquetado:

aList = [*aList, 'e'] 
#: ['a', 'b', 'c', 'd', 'e'] 

O, si necesita soporte para Python 2, utilice el operador +:

aList = aList + ['e'] 
#: ['a', 'b', 'c', 'd', 'e'] 

^Hay muchos casos en los que desea evitar los efectos secundarios de la mutación con .append(). Por un lado, imagine que desea agregar algo a una lista que ha tomado como argumento de función. Quien esté usando la función probablemente no espera que la lista que proporcionaron vaya a cambiar. El uso de algo como esto mantiene su función "pure" sin "side effects".

Cuestiones relacionadas