2012-11-05 99 views
2

我知道不建議比較類型,但我有一些代碼在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對我說謊?

回答

5

None是Python提供的特例單例。 NoneType是單例對象的類型。 type(i) is NoneFalse,但type(i) is type(None)應該是true。

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))

+0

非常真實和重要,但問題的其他部分也值得回答。 – delnan

+0

這使得在任何類型檢查代碼中檢查'None'-ness是一個特例。有時,檢查'NoneType'比檢查'x是None或isinstance(x,(footype,bartype))'更清晰。 –

+4

對象標識實際上是檢查類型的正確的事情:'type(obj)是SomeType'是我推薦用於檢查*確切*類型匹配(非常罕見的要求)。在常見情況下,使用'isinstance()'。 –