Добавление превращает мой список в NoneType - PullRequest
27 голосов
/ 01 октября 2010

В Python Shell я ввел:

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  

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

Ответы [ 3 ]

42 голосов
/ 01 октября 2010

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

3 голосов
/ 26 февраля 2018

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

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

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

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

^ Во многих случаях вы хотите избежать побочных эффектов мутации с * 1009.*.Во-первых, представьте, что вы хотите добавить что-то в список, который вы взяли в качестве аргумента функции.Кто бы ни использовал функцию, вероятно, не ожидает, что список, который они предоставили, будет изменен.Использование чего-то подобного сохраняет вашу функцию «чистой» без «побочных эффектов» .

3 голосов
/ 15 января 2015

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

...