2013-10-23 168 views
2

我只注意到Python允許你爲一個字符串值與一些比較:爲什麼一個字符串總是「大於」一個數字?

>>> '10' > 1000 
True 
>>> 'a' > 1000 
True 
>>> 'a' > -1000 
True 

爲什麼任何字符串總是比任何數量更大?

+1

您正在比較兩種不具有任何有意義的比較的類型,所以我認爲這取決於解釋器的實現。 – Santa

+1

如果你問「Python爲什麼選擇這個規則」而不是「規則是什麼」,[Alex Martelli的回答](http://stackoverflow.com/a/2384139/908494)關於另一個問題的重複可能是你在找什麼。 – abarnert

+0

@abarnert關於爲什麼會這樣,以及爲什麼這會在Python 3中引發一個錯誤的良好解釋,謝謝。 –

回答

4

在Python 2,§5.3 - Comparisons說:

對象不同的類型,除了不同的數值類型和不同的串類型,從未比較相等; 這樣的對象被一致但是任意地排序(以便對異類陣列進行排序得到一致的結果)。此外,某些類型(例如,文件對象)僅支持簡單的比較概念,其中任何兩個類型的對象都不相等。再次,這樣的對象是任意排列但一致的。當任何操作數是複數時,<,<=,>>=運算符將引發TypeError異常。

在Python 3,§4.3 - Comparisons表示:

對象不同的類型,除了不同的數字類型,從未比較相等。此外,某些類型(例如函數對象)僅支持簡單的比較概念,即任何兩種類型的對象都不相等。 比較與另一內置數字型,當對象是不同的類型,而且不能進行比較,或在其它情況下,其中有一個複數時<<=>>=運營商將提高TypeError異常沒有定義的順序。

+0

下面也可能值得添加「CPython實現細節」,這就解釋了爲什麼他看到特定的「一致但任意」排序。 (雖然它不是100%完整的;它並沒有解釋「無」總是小於其他任何東西,而數字類型總是比任何非「無」或「數字」意味着什麼,或規則用於處理內置數值類型的病態子類,或者......但唯一的地方是你可以在源代碼中找到更多解釋。) – abarnert

相關問題