None
是一个对象。
>>> isinstance(None, object)
True
因此它可以使用像__str __()
这样的函数>>> str(None)
'None'
但为什么不对__len __()做同样的事情?
>>> len(None)
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
len(None)
TypeError: object of type 'NoneType' has no len()
似乎Pythonic与if list
可接受的方式相同,即使变量是None
而不仅仅是空列表。
是否存在会使len(None)
出现更多问题的案例?
答案 0 :(得分:15)
len
仅对对象集合有意义 - None不是集合。
答案 1 :(得分:14)
你提到你想要这个:
因为当函数返回
时,它经常出现错误None
而不是列表
据推测,您的代码如下:
list_probably = some_function()
for index in range(len(list_probably)):
...
正在获得:
TypeError: object of type 'NoneType' has no len()
请注意以下事项:
len
用于确定集合的长度(例如list
,dict
或str
- 这些是Sized
对象)。用于将任意对象转换为整数的不 - 例如,它也未针对int
或bool
实施; None
,您应该明确测试if list_probably is not None
。使用例如if list_probably
会将None
和空列表[]
视为相同,这可能不是正确的行为;和range(len(...))
的列表 - 例如for item in list_probably
,使用zip
等为len
实施None
只会隐藏错误,其中None
正在被错误地处理,与某些其他对象一样 - 每the Zen of Python( import this
):
错误绝不应该以无声方式传递。
同样for item in None
会失败,但这并不意味着实施None.__iter__
是个好主意!错误是一件好事 - 它们可以帮助您快速找到程序中的问题。