提问人:Alex Gordon 提问时间:10/8/2010 最后编辑:Mateen UlhaqAlex Gordon 更新时间:11/13/2023 访问量:1017451
TypeError:“NoneType”对象不可迭代
TypeError: 'NoneType' object is not iterable
问:
这是什么意思?例:TypeError: 'NoneType' object is not iterable
for row in data: # Gives TypeError!
print(row)
答:
这意味着 的值是 。data
None
评论
for
None
if data is not None:
for i in data or []
data
None
None
mylist = mylist.extend(morestuff)
extend
list
None
你用这样的参数调用write_file:
write_file(foo, bar)
但是你没有正确定义'foo',或者你的代码中有一个错别字,所以它正在创建一个新的空变量并将其传入。
这意味着数据变量正在传递 None(类型为 NoneType),它等效于无所谓。因此,它不能像您尝试的那样作为列表进行迭代。
评论
for row in data or []:
if data is None: raise
代码: 错误消息: for row in data:
TypeError: 'NoneType' object is not iterable
它抱怨的是哪个对象?选择两个,和 .
在 中,哪个需要可迭代?只。row
data
for row in data
data
有什么问题?其类型是 。只有类型 。所以。data
NoneType
None
NoneType
data is None
您可以在 IDE 中验证这一点,也可以通过插入例如 在语句之前,然后重新运行。print "data is", repr(data)
for
想想你接下来需要做什么:“无数据”应如何表示?我们写一个空文件吗?我们是引发异常还是记录警告或保持沉默?
错误解释:“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-008is
None
is
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++一样。
评论
NoneType
None
NameError: name 'NoneType' is not defined
TypeError: cannot concatenate 'str' and 'NoneType' objects
TypeError: 'NoneType' object is not iterable
null
nullptr
None
None
可能产生此错误的另一件事是,当您设置等于函数返回的内容时,却忘记实际返回任何内容。
例:
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 进行迭代”
评论
对我来说,这是一个戴上 Groovy 帽子而不是 Python 3 帽子的情况。
忘记了函数末尾的关键字。return
def
已经有几个月没有认真编写 Python 3 了。以为在例程中评估的最后一个语句是按照 Groovy(或 Rust)方式返回的。
进行了几次迭代,查看堆栈跟踪,插入块调试/单步执行代码以找出问题所在。try: ... except TypeError: ...
该消息的解决方案当然不会使错误跳出来。
当您获得 None Exception 时继续循环,
例:
a = None
if a is None:
continue
else:
print("do something")
这可以是来自 DB 或 excel 文件的任何可迭代对象。
它还取决于您使用的 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
因为使用 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>
我在 Databricks 中使用 Pandas 时遇到了此错误。
此错误的解决方案是在群集中安装库,在此处输入映像说明
评论
它的意思是 是 ,它不是一个可迭代的。添加 * 可防止异常,并且不会打印任何内容:data
None
or []
for row in data or []: # no more TypeError!
print(row)
* 归功于一些早期的评论;请注意,引发异常也可能是一种期望的行为和/或数据
设置不当的指标。
这里的许多答案都暗示了这一点,但此错误(以及相关错误)的解决方案不是尝试在发生此错误的行修复它,而是修复生成 .例如,if 是从函数返回的值,则确保该函数返回一个可迭代的对象(例如 list、numpy ndarray、pandas DataFrame 等)。如果是从某个 API 调用返回的值,请确保检查请求是否返回了可迭代对象。TypeError: cannot unpack non-iterable NoneType object
data
data
data
例如,在以下例中,函数打印一个值,该值隐式返回 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']
评论
None
None
None
()
''
""
None
for row in data or ():
None