错误是什么 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)
有帮助吗?

解决方案

这意味着价值 dataNone.

其他提示

错误的说明:“非型”对象是不可能的

在Python2中,非类型是无类型。例如,在Python3中,非类型是NONE的类别,例如:

>>> print(type(None))     #Python2
<type 'NoneType'>         #In Python2 the type of None is the 'NoneType' type.

>>> print(type(None))     #Python3
<class 'NoneType'>        #In Python3, the type of None is the 'NoneType' class.

迭代具有一个无价值的变量失败:

for a in None:
    print("k")     #TypeError: 'NoneType' object is not iterable

Python方法如果不返回值,则返回非类型:

def foo():
    print("k")
a, b = foo()      #TypeError: 'NoneType' object is not iterable

您需要检查这样的非类型的循环结构:

a = None 
print(a is None)              #prints True
print(a is not None)          #prints False
print(a == None)              #prints True
print(a != None)              #prints False
print(isinstance(a, object))  #prints True
print(isinstance(a, str))     #prints False

Guido说仅使用 is 检查 None 因为 is 对身份检查更强大。不要使用平等操作,因为这些操作可以吐出自己的泡泡实施炎。 Python的编码样式指南-PEP -008

非视频是偷偷摸摸的,可以从Lambdas偷偷摸摸:

import sys
b = lambda x : sys.stdout.write("k") 
for a in b(10): 
    pass            #TypeError: 'NoneType' object is not iterable 

非类型不是有效的关键字:

a = NoneType     #NameError: name 'NoneType' is not defined

串联 None 和一个字符串:

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

这里发生了什么?

Python的解释器将您的代码转换为PYC字节码。 Python虚拟机处理了字节码,它遇到了一个循环构造,该构造在包含无的变量上迭代。该操作是通过调用 __iter__ 无。

没有人没有 __iter__ 定义的方法,因此Python的虚拟机告诉您它看到了什么:非类型没有 __iter__ 方法。

这就是为什么 python的鸭子型 意识形态被认为是不好的。程序员使用变量做得完全合理,并且在运行时不会被无污染,Python虚拟机尝试士兵,并在地毯上撒了一堆无关的胡说八道。

Java或C ++没有这些问题,因为这样的程序不允许编译,因为您没有在没有发生时定义该怎么做。 Python为程序员提供了很多绳索来悬挂自己,因为您可以做很多在特殊情况下不能期望工作的事情。 python是一个是的人,当它阻止您伤害自己时说“是”,例如Java和C ++。

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

它在抱怨哪个对象?两个选择, rowdata。在 for row in data, ,哪个需要它?仅有的 data.

有什么问题 data?它的类型是 NoneType. 。仅有的 None 有类型 NoneType. 。所以 data is None.

您可以在IDE中或通过插入EG进行验证 print "data is", repr(data) 之前 for 声明和重新运行。

考虑下一步需要做什么: 应该如何表示“无数据”?我们写一个空文件吗?我们会提出例外还是记录警告或保持沉默?

可能会产生此错误的另一件事是,当您设置与函数返回相同的东西时,但忘记了实际返回任何内容。

例子:

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)

这是一个很难发现的错误,因为如果行变量恰好在其中一个迭代中,则可能会产生错误。发现它的方法是,痕迹在最后一行而不是在函数内部失败。

如果您只从函数返回一个变量,我不确定是否会产生错误...我怀疑错误“'nontype'对象在python中是不可能的”,在这种情况下,我实际上意味着“嘿,我正在尝试迭代返回值以按顺序将它们分配给这三个变量,但我只能迭代遍历”

这意味着数据变量是通过无(类型非类型)的,其等效的 没有. 。因此,就像您试图做的那样,它作为列表不可能。

您正在用这样的参数调用write_file:

write_file(foo, bar)

但是您尚未正确定义“ foo”,或者您的代码中有错别字,因此它正在创建一个新的空变量并将其传递给。

对我来说,这是我的 Groovy帽子 在代替python 3上。

忘了 return 关键字在 def 功能。

几个月来一直没有认真地编码Python 3。正在思考以常规评估的最后一份声明正在以凹陷的方式返回。

进行了一些迭代,看着堆栈痕迹,插入 try: ... except TypeError: ... 阻止调试/踏入代码,以找出出了什么问题。

消息的解决方案当然并没有使我对我跳出来。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top