35

在 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  

有谁知道发生了什么?我该如何解决/解决它?

4

4 回答 4

52

list.append是一种修改现有列表的方法。它不会返回一个新列表——它会返回None,就像大多数修改列表的方法一样。只需这样做aList.append('e'),您的列表就会附加该元素。

于 2010-10-01T15:46:53.060 回答
5

通常,您想要的是公认的答案。但是,如果您想要覆盖值并创建新列表的行为(在某些情况下这是合理的^),您可以做的是使用“splat 运算符”,也称为列表解包:

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

或者,如果您需要支持 python 2,请使用+运算符:

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

^ 在很多情况下,您希望避免使用.append(). 一方面,假设您想将某些内容附加到您作为函数参数的列表中。使用该功能的人可能不会期望他们提供的列表会被更改。使用这样的东西可以让你的函数保持“纯粹”而没有“副作用”

于 2018-02-26T02:32:17.360 回答
4

删除您的第二行aList = aList.append('e')并仅使用aList.append("e"),这应该可以解决该问题。

于 2015-01-14T21:12:00.980 回答
0

有时,当您忘记在另一个函数末尾返回一个函数并传递一个空列表时会出现此错误,解释为 NoneType。

由此:

def func1():
  ...
  func2(empty_list)

def func2(list):
  ...
  # use list here but it interpreted as NoneType

对此:

def func1():
  ...
  return func2(empty_list)
    
def func2(list):
  ...
  # use list here, it will be interpreted as an empty List
于 2021-07-14T10:57:25.683 回答