【问题标题】:comparison with type of None variables与 None 变量的类型比较
【发布时间】:2012-10-25 16:16:03
【问题描述】:

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

【问题讨论】:

    标签: python python-3.x nonetype


    【解决方案1】:

    您永远不需要与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))

    【讨论】:

    • 非常真实和重要,但问题的其他部分也值得回答。
    • 这使得检查None-ness 在任何类型检查代码中都是一种特殊情况。有时,检查NoneType 比检查x is None or isinstance(x, (footype, bartype)) 更干净。
    • 对象标识实际上是检查类型的正确方法:type(obj) is SomeType 是我建议检查 exact 类型匹配的方法(非常罕见的要求)。一般情况下,使用isinstance()
    • @SvenMarnach 很高兴知道!出于某种原因,我认为类型检查需要进行值比较。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-03-20
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 2021-06-28
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      相关资源
      最近更新 更多