Python 为什么';t len(无)返回0?

Python 为什么';t len(无)返回0?,python,nonetype,Python,Nonetype,Python中的None是一个对象 >>> isinstance(None, object) True 因此,它可以使用像_ustr _uuu()这样的函数 但是为什么它对_len__()不起同样的作用呢 >>len(无) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 len(无) TypeError:类型为“NoneType”的对象没有len() 它似乎是Pythonic,就像if list是可接受的一样,即使变量是None,而不仅仅是一个空列表 是否存在使用le

Python中的
None
是一个对象

>>> isinstance(None, object)
True
因此,它可以使用像_ustr _uuu()这样的函数

但是为什么它对_len__()不起同样的作用呢

>>len(无)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
len(无)
TypeError:类型为“NoneType”的对象没有len()
它似乎是Pythonic,就像
if list
是可接受的一样,即使变量是
None
,而不仅仅是一个空列表


是否存在使用
len(None)
更成问题的情况?

len
仅对对象集合有意义-无不是集合。

您提到您希望:

因为当函数返回
None
而不是列表时,它经常作为错误出现

大概您有这样的代码:

list_probably = some_function()
for index in range(len(list_probably)):
    ...
并且正在得到:

TypeError: object of type 'NoneType' has no len()
注意以下几点:

  • len
    用于确定集合的长度(例如
    列表
    dict
    str
    ——这些是对象)。它不用于将任意对象转换为整数——例如,它也不用于
    int
    bool
  • 如果
    None
    是一种可能性,您应该明确测试list\u是否可能不是None。例如,使用
    if list\u可能
    会将
    None
    和空列表
    []
    视为相同,这可能不是正确的行为;及
  • 通常有更好的方法来处理
    范围(len(…)
    )的列表-例如,对于列表中的项目
    ,使用
    zip
    ,等等
None
实现
len
只会隐藏错误,在
None
被错误处理的地方,就像其他对象一样-per(
导入此
):

错误永远不应该悄无声息地过去


类似地,对于None中的项目
也会失败,但这并不意味着实现
None.\uu iter\uuuu
是个好主意!错误是一件好事-它们可以帮助您快速发现程序中的问题。

因为
None
没有
\uuuu\uuuu
;它不是。@jornsharpe,但它可以添加一个不管发生什么都返回0的函数。它可以,但没有多大意义。为什么一个对象会有一个长度,除非它是一个对象集合?如果你有一个可以得到
None
list
的情况,你应该先测试
如果我认为是什么\u列表不是None:
,然后再把它当作一个列表。所有内置类型都具有真实性,但在
None
上有许多操作毫无意义(您也不能对其进行迭代)。为
None
实现
len
只会隐藏应该捕获的错误。
None
没有长度,原因与整数和浮点没有长度相同。这不是一个收藏。它不能变长或变短。说它总是可以返回0比
None
的真实性(或错误性)更没有意义吗?@SuperBiasedMan是的,它没有那么有意义。问问你自己,红色的长度是0吗?@SuperBiasedMan是的!整数也没有长度,但具有真实性-请参阅。还请注意,您通常应该通过身份而不是真实性来测试
None
。@jornsharpe这一点特别好。我想我认为len()只是返回一个表示变量的int值,而不是显式地作为集合的计数。(另外,我指的是用真实性测试列表,当你没有列表而不是列表时,它会处理这个案例)
list_probably = some_function()
for index in range(len(list_probably)):
    ...
TypeError: object of type 'NoneType' has no len()