2014-02-26 35 views
22

我從蟒蛇無獲悉:爲什麼None在Python中最小?

None is frequently used to represent the absence of a value

當我把一個列表,並以數字和字符串排序。我得到了以下結果,這意味着它是最小的數字?

反向:

>>> sorted([1, 2, None, 4.5, (-sys.maxint - 1), (sys.maxint - 1), 'abc'], reverse=True) 
['abc', 9223372036854775806, 4.5, 2, 1, -9223372036854775808, None] 
>>> 

正常排序:

>>> sorted([1, 2, None, 4.5, (-sys.maxint - 1), (sys.maxint - 1), 'abc']) 
[None, -9223372036854775808, 1, 2, 4.5, 9223372036854775806, 'abc'] 
>>> 

蟒蛇如何排序的功能正在與無?

+0

http://stackoverflow.com/questions/2214194/is-everything-greater-than-none – ndpu

回答

42

當比較不同的類型,CPython的2施加一些不同的規則:

  • None首先排序。
  • 數字來其他類型之前,且其本身在數量上進行比較。
  • 其他類型由它們類型名稱下令,除非他們明確實現比較方法。

此外,一些類型實現自定義排序規則,並可以拒絕所有排序嘗試。當您嘗試責令其複數引發異常,例如,和datetime對象做,當你試圖相對於其他類型進行排序。

這不是Python的參考文檔中記錄;請參閱default comparison code in object.c。這是一個實現細節,而不是你的代碼應該依賴的東西。該comparison operators documentation狀態:

大多數內置類型比較不平等,除非它們是同一個對象的其他對象;一個對象被認爲是小於還是大於另一個的選擇是任意的,但是在程序的一次執行中是一致的。

目標是在對一系列混合對象進行排序時,對不同類型之間的比較進行穩定。

在Python 3,比較規則已被收緊;你只能比較顯式實現比較的對象。經過多年的經驗得出的結論是,允許任意比較只會導致更多的混淆;例如,比較字符串和數字中的數字總是會讓新手感到困惑。

您的代碼將引發異常來代替。

+0

非常感謝你,你會介意給一些鏈接或任何官方文檔。 –

+2

@yopy:我認爲在文檔中沒有提到這一點。我總是看源代碼。我會添加一些參考。 –

+0

除「None」未被排序之外,如被拒絕的http://bugs.python.org/issue1673405。 (最近一個python-dev線程指出規範從來沒有實際上有一個「None首先被排序」的規則,即使它*通常是*在cPython 2中)。 – geoffspear

相關問題