TypeError:'NoneType'对象在Python中是不可迭代的

错误TypeError: 'NoneType' object is not iterable是什么TypeError: 'NoneType' object is not iterable意思?

我得到这个Python代码:

 def write_file(data,filename): #creates file and writes list to it with open(filename,'wb') as outfile: writer=csv.writer(outfile) for row in data: ##ABOVE ERROR IS THROWN HERE writer.writerow(row) 

这意味着“数据”是无。

代码: for row in data:
错误消息: TypeError: 'NoneType' object is not iterable

它抱怨哪个对象? 两个, rowdata 。 在for row in data ,哪些需要迭代? 只有data

data什么问题? 它的types是NoneType 。 只有None才能inputNoneType 。 所以data is None

您可以在IDE中validation这一点,或者通过插入例如在for语句之前print "data is", repr(data) ,然后重新运行。

想想下一步你需要做什么:应该如何表示“无数据”? 我们写一个空文件吗? 我们是否会提出exception或logging警告或保持沉默?

如何在python中重现这个错误:

Python方法将返回NoneType如果你期望从他们的元组,并没有返回任何东西来填补他们:

 >>> def baz(): ... print("k") ... >>> a, b = baz() k Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'NoneType' object is not iterable 

如果将NoneType分配给variables,也可以得到该错误:

 >>> a = NoneType Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined 

如果您尝试在for循环中迭代NoneType,则会出现该错误:

 >>> for i in NoneType: ... print("Yeah") ... Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined 

尝试连接None和一个string,你会得到这个错误:

 >>> bar = "something" >>> foo = None >>> print foo + bar TypeError: cannot concatenate 'str' and 'NoneType' objects 

如果您使用包含NoneType的方法传递的variables,则会出现该错误:

 >>> def foo(data): ... print(data) ... >>> foo(NoneType) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined 

这里是怎么回事? 谁,什么,几时,哪里,为什么,怎样?

Python解释器将上面的代码转换为pyc字节码,然后Python虚拟机的执行线遇到了for循环,这个循环调用了名为data的variables的__iter__方法。

data的值为None,显然没有__iter__方法,所以Python虚拟机正在告诉你它看到了什么:你提供给它的NoneType对象没有一个__iter__方法,这个方法把我交给了一个迭代器。

这就是为什么Python的鸭子打字被认为是不好的原因。 你做了一件完全合理的事情,一个完全合理的例外随之而来,python虚拟机在地毯上堆起了一堆无关的废话。

Java没有这些问题,因为这样的程序甚至不会编译,因为你没有定义你的返回types,也没有指定在exception期间要做什么。

这意味着数据variables传递无(这是typesNoneType),它的等价物没有 。 所以它不能像列表那样迭代,就像你正在做的那样。

你用这样的参数调用write_file:

 write_file(foo, bar) 

但是你没有正确定义'foo',或者你的代码中有一个错字,所以它创build一个新的空variables并传入。

另一件可能产生这个错误的事情是,当你设置的东西等于函数返回的时候,却忘了实际返回任何东西。

例:

 def foo(dict_of_dicts): for key, row in dict_of_dicts.items(): for key, inner_row in row.items(): Do SomeThing #Whoops, forgot to return all my stuff return1, return2, return3 = foo(dict_of_dicts) 

这是有点难以发现的错误,因为如果在一次迭代中行variables恰好为无,也可能产生错误。 发现它的方法是在最后一行失败,而不是在函数内部。

如果你只从一个函数返回一个variables,我不知道是否会产生错误…我怀疑“NoneType”对象是不是Python中可迭代的“在这种情况下实际上是暗示”嘿,我试图迭代返回值,以便将它们分配给这三个variables,但我只是得到None来遍历“