2010-10-01 2 views
13

В Python Shell, я вошел:Добавление данных превращает мой список NoneType

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

и получил

a 
b 
c 
d 

, но когда я попробовал:

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

и получил

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

Кто-нибудь знает, что происходит? Как я могу исправить/обойти это?

ответ

25

list.append - метод, который изменяет существующий список. Он не возвращает новый список - он возвращает None, как и большинство методов, которые изменяют список. Просто сделайте aList.append('e'), и ваш список добавит элемент.

+0

И поскольку он ничего не возвращает, вы устанавливаете aList в None, если вы выполняете задание, поэтому вы получаете ошибку. – kindall

+0

Все функции возвращают что-то :) –

+1

true - но иногда это * something * is 'None'. Но «Нет» действительно что-то? Моя голова болит! –

2

Удалить свою вторую строку aList = aList.append('e') и использовать только aList.append("e"), это должно избавиться от этой проблемы.

0

Как правило, то, что вы хотите, является принятым ответом. Но если вы хотите, чтобы поведение заменяющего значения и создание нового списка (который является разумным в некоторых случаях ^), что вы могли бы сделать вместо этого использовать «пейнтбольный оператор», также известный как список распаковка:

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

Или, если вам нужна поддержка Python 2, используйте + оператор:

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

^Есть много случаев, когда вы хотите, чтобы избежать побочных эффектов мутирует с .append(). Например, представьте, что вы хотите добавить что-то в список, который вы использовали в качестве аргумента функции. Тот, кто использует эту функцию, вероятно, не ожидает, что список, который они предоставили, будет изменен. Используя что-то вроде этого, держите свою функцию "pure" без "side effects".