4

我知道不建议比较类型,但我有一些代码在 if elif 系列中执行此操作。但是,我对 None 值如何工作感到困惑。

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 对我撒谎?

4

2 回答 2

9

None是 Python 提供的一种特殊情况的单例。 NoneType是单例对象的类型。 type(i) is NoneFalse,但type(i) is type(None)应该是真的。

于 2012-11-05T19:12:42.817 回答
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))

于 2012-11-05T19:12:31.460 回答