TypeError:“NoneType”对象不可迭代

TypeError: 'NoneType' object is not iterable

提问人:Alex Gordon 提问时间:10/8/2010 最后编辑:Mateen UlhaqAlex Gordon 更新时间:11/13/2023 访问量:1017451

问:

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

for row in data:  # Gives TypeError!
    print(row)
python 类型错误 nonetype

评论

4赞 nehem 9/1/2017
这是我对 Python 的烦人失望之一。当被强制作为序列时,它必须产生一个空的序列,完全无害。None
11赞 ShadowRanger 10/6/2018
@nehemiah:Python 是强类型的(只是不是静态类型的)。 从不被胁迫做任何事情。像其他类型的人一样默默地表现会隐藏错误;这与“无害”相反。如果你需要一个假占位符来表示空序列,你可以使用 或 /,这两个都是单例,可以像 一样便宜地加载。如果你想选择默默地将任何虚假的东西视为空序列,你可以这样做,但没有人这样做,因为传递给一个需要序列的函数是一个不应该默默传递的错误。NoneNone()''""Nonefor row in data or ():None
0赞 Albert Hendriks 1/1/2021
在 python 2 中安装不再支持 python 2 的模块时,您也可能会收到此错误,例如 stackoverflow.com/q/63346648/838494

答:

265赞 vanza 10/8/2010 #1

这意味着 的值是 。dataNone

评论

68赞 nehem 9/1/2017
没错,但作者在这里的常见方案完全是跳过循环,而不是引发异常。Python 的设计在这里是有缺陷的。当被视为可迭代对象时,它必须至少返回空列表。这个例外在现实生活中除了让我们插入一些丑陋的处理方式之外,从来没有帮助过任何人。forNoneif data is not None:
67赞 BMW 3/28/2018
尝试for i in data or []
9赞 ShadowRanger 10/6/2018
@nehemiah:其实正确的方法不是检查是否是,而是让异常发生。您希望 API 的使用者知道他们何时错误地使用了 API。接受为空序列会让像这样的错误隐藏得更久;他们认为他们 ed a(他们确实这样做了,但后来立即将其替换为 ),然后将其传递给 OP 的函数,并想知道为什么文件是空的,没有引发任何类型的错误。dataNoneNonemylist = mylist.extend(morestuff)extendlistNone
1赞 Mateen Ulhaq 6/6/2022
@nehem Python 的设计当然没有缺陷。更严格的类型系统使 bug 更容易被发现。参见 Rust、Haskell、Scala 等人。
0赞 nehem 6/6/2022
你确实意识到 Python 不是强类型语言,对吧,至少在任何地方都保持一致,而不是试图成为一切。
7赞 clee 10/8/2010 #2

你用这样的参数调用write_file:

write_file(foo, bar)

但是你没有正确定义'foo',或者你的代码中有一个错别字,所以它正在创建一个新的空变量并将其传入。

8赞 Rod 10/8/2010 #3

这意味着数据变量正在传递 None(类型为 NoneType),它等效于无所谓。因此,它不能像您尝试的那样作为列表进行迭代。

评论

3赞 deltanine 8/19/2013
如果只是像空列表一样迭代就好了......会要求更干净的代码和更少的错误检查
4赞 Mark 12/28/2014
@deltanine我认为,这会导致很多问题更难检测。我很高兴 None 与空的可迭代对象不同。如果您想要描述的行为,只需使用for row in data or []:
0赞 nehem 7/21/2021
@Mark如果它返回空列表,它会更干净。如果您希望它失败,您可以随时添加一行if data is None: raise
64赞 John Machin 10/8/2010 #4

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

它抱怨的是哪个对象?选择两个,和 . 在 中,哪个需要可迭代?只。rowdatafor row in datadata

有什么问题?其类型是 。只有类型 。所以。dataNoneTypeNoneNoneTypedata is None

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

想想你接下来需要做什么:“无数据”应如何表示?我们写一个空文件吗?我们是引发异常还是记录警告或保持沉默?

118赞 Eric Leschinski 7/7/2015 #5

错误解释:“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说,只用于检查,因为对身份检查更可靠。不要使用相等操作,因为这些操作可能会吐出自己的冒泡实现。Python 的编码风格指南 - PEP-008isNoneis

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 没有定义方法,因此 Python 的虚拟机会告诉你它所看到的:NoneType 没有方法。__iter____iter__

这就是为什么 Python 的鸭子打字意识形态被认为是坏的。程序员用一个变量做了一些完全合理的事情,在运行时它被 None 污染了,python 虚拟机试图继续前进,并在地毯上吐出一堆不相关的废话。

Java 或 C++ 没有这些问题,因为这样的程序不允许编译,因为您还没有定义当 None 发生时要做什么。Python 允许程序员做很多在特殊情况下不应该工作的事情,从而为程序员提供了许多可以自挂的绳索。Python是一个“是”的人,当它阻止你伤害自己时,会说“是”,就像Java和C++一样。

评论

2赞 John Machin 1/8/2017
(a) 混淆和 (b) 认为 和 (c) Python 和 java 之间的比较是“一堆不相关的废话”NoneTypeNoneNameError: name 'NoneType' is not definedTypeError: cannot concatenate 'str' and 'NoneType' objectsTypeError: 'NoneType' object is not iterable
4赞 ShadowRanger 10/6/2018
呃......如果将 Java 传递给需要任何集合类型的函数,则 Java 将遇到基本相同的问题。C++ 会有同样的问题(但通常只是在段错误中死亡而不报告原因)(诚然,好的 C++ 很少使用指针,但你所展示的是糟糕的 Python,糟糕的 C++ 也可能在运行时因 null 而死亡)。Python 在这里做了正确的事情;它不是“继续战斗”,而是在你尝试用于任何不能做的事情的那一刻出错。你的问题不在于 Python,而在于一般的动态类型语言。nullnullptrNoneNone
20赞 gunslingor 1/25/2017 #6

可能产生此错误的另一件事是,当您设置等于函数返回的内容时,却忘记实际返回任何内容。

例:

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)

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

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

评论

3赞 Dr_Zaszuś 10/5/2018
这正是把我带到这里的原因。那么,对于这种情况,Pythonic的解决方案是什么呢?
1赞 Dr_Zaszuś 10/5/2018
这里似乎有一些帮助:stackoverflow.com/questions/1274875/...
1赞 user3685427 3/25/2021
Dr_Zaszus这也正是我的问题。这个特定的答案只是说确实存在问题。而且,接受的答案基本上也只是说“是的,这会抛出错误”。整个线程缺乏实际的、好的、公认的实践答案来解决根本问题。提到的最佳解决方案是在注释中,即添加“如果数据不是 None:”,这是一个丑陋的解决方案。
2赞 JGFMK 11/28/2018 #7

对我来说,这是一个戴上 Groovy 帽子而不是 Python 3 帽子的情况。

忘记了函数末尾的关键字。returndef

已经有几个月没有认真编写 Python 3 了。以为在例程中评估的最后一个语句是按照 Groovy(或 Rust)方式返回的。

进行了几次迭代,查看堆栈跟踪,插入块调试/单步执行代码以找出问题所在。try: ... except TypeError: ...

该消息的解决方案当然不会使错误跳出来。

-3赞 Sappaa 1/21/2021 #8

当您获得 None Exception 时继续循环,

例:

   a = None
   if a is None:
       continue
   else:
       print("do something")

这可以是来自 DB 或 excel 文件的任何可迭代对象。

1赞 Aman Gupta 9/16/2021 #9

它还取决于您使用的 Python 版本。在python 3.6和python 3.8中看到不同的错误消息如下,这是我的问题

  • Python 3.6 中文文档
(a,b) = None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable
  • Python 3.8 中文文档
(a,b) = None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot unpack non-iterable NoneType object
0赞 Pola Pola 4/3/2022 #10

因为使用 for 循环,而结果只是一个值,而不是一组值

pola.py

@app.route("/search")
def search():
    title='search'
    search_name =  request.form.get('search')
    
    search_item =   User.query.filter_by(id=search_name).first()

    return render_template('search.html', title=title, search_item=search_item  ) 

搜索 .html (错误)

{% for p in search %}
{{ p }}

搜索 .html (正确)

<td>{{ search_item  }}</td>
0赞 jhonatanrestrepoh 10/6/2022 #11

我在 Databricks 中使用 Pandas 时遇到了此错误。

此错误的解决方案是在群集中安装库,在此处输入映像说明

评论

1赞 Tony Williams 10/11/2022
您需要使用代码块而不是代码块的图片来包含代码。
1赞 Ricardo 12/3/2022 #12

它的意思是 是 ,它不是一个可迭代的。添加 * 可防止异常,并且不会打印任何内容:dataNoneor []

for row in data or []:  # no more TypeError!
    print(row)

* 归功于一些早期的评论;请注意,引发异常也可能是一种期望的行为和/或数据设置不当的指标。

0赞 cottontail 11/10/2023 #13

这里的许多答案都暗示了这一点,但此错误(以及相关错误)的解决方案不是尝试在发生此错误的行修复它,而是修复生成 .例如,if 是从函数返回的值,则确保该函数返回一个可迭代的对象(例如 list、numpy ndarray、pandas DataFrame 等)。如果是从某个 API 调用返回的值,请确保检查请求是否返回了可迭代对象。TypeError: cannot unpack non-iterable NoneType objectdatadatadata

例如,在以下例中,函数打印一个值,该值隐式返回 None,一旦我们尝试迭代它,这会导致标题中的 TypeError。func()

def func():
    print('a string')

list(func())  # TypeError: 'NoneType' object is not iterable

相反,请确保返回一个值:

def func():
    return 'a string'

list(func())  # ['a', ' ', 's', 't', 'r', 'i', 'n', 'g']