首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PythonPython语言:在TypeError中无法迭代“”NoneType“”对象

PythonPython语言:在TypeError中无法迭代“”NoneType“”对象
EN

Stack Overflow用户
提问于 2010-10-08 10:56:26
回答 6查看 781K关注 0票数 179

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

我在这段Python代码中得到了它:

代码语言:javascript
复制
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)
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-10-08 10:57:22

表示data的值为None

票数 243
EN

Stack Overflow用户

发布于 2015-07-07 08:33:28

错误解释:'NoneType‘对象不可迭代

在python2中,NoneType的类型为None。在Python3中,NoneType是None的类,例如:

代码语言:javascript
复制
>>> 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的变量失败:

代码语言:javascript
复制
for a in None:
    print("k")     #TypeError: 'NoneType' object is not iterable

如果Python方法不返回值,则返回NoneType:

代码语言:javascript
复制
def foo():
    print("k")
a, b = foo()      #TypeError: 'NoneType' object is not iterable

您需要像这样检查NoneType的循环结构:

代码语言:javascript
复制
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偷偷进入:

代码语言:javascript
复制
import sys
b = lambda x : sys.stdout.write("k") 
for a in b(10): 
    pass            #TypeError: 'NoneType' object is not iterable 

NoneType不是有效的关键字:

代码语言:javascript
复制
a = NoneType     #NameError: name 'NoneType' is not defined

None和字符串的连接:

代码语言:javascript
复制
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++那样。

票数 102
EN

Stack Overflow用户

发布于 2017-01-25 22:33:35

另一种可能产生此错误的情况是,当您设置与函数的返回值相等的值时,却忘记了实际返回任何值。

示例:

代码语言:javascript
复制
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“在这种情况下实际上是在暗示”嘿,我正试图迭代返回值,以便按顺序将它们分配给这三个变量,但我只得到了一个都没有迭代。“

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3887381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档