我知道不建议比较类型,但我有一些代码在if elif系列中执行此操作。但是,我对于无值的工作原理感到困惑。
def foo(object)
otype = type(object)
#if otype is None: # this doesn't work
if object is None: # this works fine
print("yep")
elif otype is int:
elif ...
为什么我可以与is int
等进行比较,但不能与is None
进行比较? types.NoneType似乎在Python 3.2中消失了,所以我不能使用它......
以下
i = 1
print(i)
print(type(i))
print(i is None)
print(type(i) is int)
打印
1
<class 'int'>
False
True
而
i = None
print(i)
print(type(i))
print(i is None)
print(type(i) is None)
打印
None
<class 'NoneType'>
True
False
我猜None
很特别,但是给出了什么? NoneType
确实存在,或者Python对我说谎了吗?
答案 0 :(得分:6)
您永远不需要与NoneType
进行比较,因为None
是单身人士。如果您的某个对象obj
可能是None
,则只需obj is None
或obj is not None
。
您的比较不起作用的原因是None
不是类型,而是值。它类似于在整数示例中尝试type(1) is 1
。如果您真的想进行NoneType
检查,可以使用type(obj) is type(None)
,或者更好isinstance(obj, type(None))
。
答案 1 :(得分:6)
None
是Python提供的特例单例。 NoneType
是单例对象的类型。 type(i) is None
为False
,但type(i) is type(None)
应为真。