与None变量的类型比较

时间:2012-11-05 19:09:35

标签: python python-3.x nonetype

我知道不建议比较类型,但我有一些代码在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对我说谎了吗?

2 个答案:

答案 0 :(得分:6)

您永远不需要与NoneType进行比较,因为None是单身人士。如果您的某个对象obj可能是None,则只需obj is Noneobj 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 NoneFalse,但type(i) is type(None)应为真。