2015-12-13 77 views
3

python語言參考提到了三個對象,它們有一個唯一的實例:NoneNotImplementedEllipsissection 3.2 "The Standard Type Hierarchy")。測試x is NoneNone的保證唯一性所成爲可能的常見成語。我無法在python文檔或堆棧溢出中找到任何其他唯一實例對象。有幾個問題,如this one對構建這些對象的方法提出了有趣的建議,但是我想知道的是,除了這三個內置函數之外是否還有其他任何內容。在Python中除None以外的其他唯一實例對象?

例如,()看起來是獨一無二的(在CPython中測試非常有限),測試x is()安全嗎?或者是x ==()強制這種情況下?

+0

如果測試x是()',如果x'將達到相同,則沒有任何意義。你爲什麼真的在問? –

+0

「bool(x)'是'False'有很多可能的值。我需要檢查'x'是否實際上是'()',而不是其他的可能性之一,因爲你使用'x是None'的原因完全一樣。 –

+0

如果x是一個元組,那麼'isinstance(x,tuple)'也會明確地允許你檢查x實際上是一個元組 –

回答

1

不,沒有其他內置類型具有單一值。這些單身人士唯一的親戚是bool類型,它允許兩個值(即TrueFalse)*。

Python 2.x(我不能在3.x找到他們),你可以通過從types模塊導入NotImplementedType, EllipsisType, NoneType看到此限制,並意識到它是明確不與它的奇特風俗TypeError

In [13]: from types import NoneType 

In [14]: n = NoneType() 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-14-b386f51143fb> in <module>() 
----> 1 n = NoneType() 

TypeError: cannot create 'NoneType' instances 

()是不幸的是不是唯一的,它代表一個空元組,如果Tuple類型是唯一的,那麼NoneType是唯一的,那麼它的所有實例將需要具有相同的值


如果你想利用這些細看,它們位於Objects/object.c在線路1351分別1473NoneNotImplemented。省略號尚未找到。


*更新:顯然,TrueFalse單身,根據PEP 285 - Adding a bool type

值假和真將是單身,像無。因爲 類型有兩個值,或許這些應該被稱爲 「doubletons」?真正的實現將不允許創建其他 bool實例

1

對於什麼是價值,()不是唯一在PyPy 4.0.1:

>>>> x =() 
>>>> x is() 
False 
+1

他特別提到了CPython。 –

2

嗯......你能想到的任何全局對象爲在這個意義上是「獨一無二」的,它始終是同一個對象。

例如:

>>> x = file 
>>> x is file 
True 
>>> x = True 
>>> x is True 
True 
>>> x = ZeroDivisionError 
>>> x is ZeroDivisionError 
True 

沒有什麼特別之處:

>>> x = None 
>>> x is None 
True 

什麼你可能想知道就是爲什麼你應該測試x is None而非x == None

答案是:x == None會叫x.__eq__(None)它可以在各種情況下返回True其中x實際上不是None(雖然在現實中不是很常見)。

實例?

那麼,你可能會說有一個區別:None是一個實例。

嗯,事實是,Python中的所有東西都是一個對象,這意味着一切都是一個實例。在我的例子,fileZeroDivisionErrortype情況下,TrueboolNone實例的實例NoneType(注意,typetype一個實例,因此沒有例外的規則)。

有一個關於一個特別的東西None - 這是NoneType唯一實例,你不能讓別人(除非有一些好的把戲嗎?)

但是,這實際上是NoneType屬性 - 它不會讓你創造了新的實例:

TypeError: cannot create 'NoneType' instances 

但是,這對於整個故事並不是必不可少的。

編輯這些「」唯一實例對象「被稱爲單例。當然,你可以製作一些你的。

相關問題