error 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)
发布于 2010-10-08 10:57:22
表示data
的值为None
。
发布于 2015-07-07 08:33:28
错误解释:'NoneType‘对象不可迭代
在python2中,NoneType的类型为None。在Python3中,NoneType是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.
迭代值为None的变量失败:
for a in None:
print("k") #TypeError: 'NoneType' object is not iterable
如果Python方法不返回值,则返回NoneType:
def foo():
print("k")
a, b = foo() #TypeError: 'NoneType' object is not iterable
您需要像这样检查NoneType的循环结构:
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's Coding Style Guidelines - PEP-008
NoneTypes是Sneaky的,可以从lambda偷偷进入:
import sys
b = lambda x : sys.stdout.write("k")
for a in b(10):
pass #TypeError: 'NoneType' object is not iterable
NoneType不是有效的关键字:
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虚拟机处理字节码时,遇到了一个循环结构,该结构表示迭代包含None的变量。操作是通过在None上调用__iter__
方法来执行的。
None没有定义__iter__
方法,所以Python的虚拟机会告诉您它所看到的: NoneType没有__iter__
方法。
这就是为什么Python's duck-typing思想被认为是不好的。程序员用一个变量做一些完全合理的事情,在运行时它不会受到任何污染,python虚拟机试图坚持下去,并在地毯上吐出一堆无关的废话。
Java或C++没有这些问题,因为这样的程序是不允许编译的,因为您还没有定义在没有发生任何事情时要做什么。Python给了程序员很多上吊的机会,因为它允许你做很多在特殊情况下不能工作的事情。Python是一个唯唯诺诺的人,当它阻止你伤害自己时,他会说是-先生,就像Java和C++那样。
发布于 2017-01-25 22:33:35
另一种可能产生此错误的情况是,当您设置与函数的返回值相等的值时,却忘记了实际返回任何值。
示例:
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)
这是一个很难发现的错误,因为如果在一次迭代中row变量碰巧为None,也会产生错误。发现它的方法是跟踪在最后一行失败,而不是在函数内部。
如果你只从一个函数中返回一个变量,我不确定是否会产生这个错误...我怀疑错误"'NoneType‘object is not iterable in Python“在这种情况下实际上是在暗示”嘿,我正试图迭代返回值,以便按顺序将它们分配给这三个变量,但我只得到了一个都没有迭代。“
https://stackoverflow.com/questions/3887381
复制相似问题