追加将我的列表转换为NoneType

时间:2010-10-01 15:45:13

标签: python mutators

在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 个答案:

答案 0 :(得分:40)

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

答案 1 :(得分:3)

删除第二行aList = aList.append('e')并仅使用aList.append("e"),这应该可以摆脱这个问题。

答案 2 :(得分:3)

一般来说,你想要的是接受的答案。但是如果你想要覆盖值并创建一个新列表的行为(在某些情况下这是合理的^),你可以做的是使用&#34; splat运算符&#34;,也称为列表解包:< / p>

notify()

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

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

^在许多情况下,您希望避免使用+进行变异的副作用。首先,想象一下你想要将某些东西附加到你作为函数参数的列表中。使用该功能的人可能并不期望他们提供的列表会被更改。使用这样的内容可以使您的函数"pure"保持"side effects"

答案 3 :(得分: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