2013-06-24 70 views
15

爲什麼下面的代碼是正確的?爲什麼空字典大於1?

>>> foo = {} 
>>> foo > 1 
True 
>>> foo < 1 
False 
>>> foo == 0 
False 
>>> foo == -1 
False 
>>> foo == 1 
False 

我明白我想要的是len(foo)> 1,但作爲初學者,這讓我感到驚訝。

+13

值得慶幸的是,這在Python已經成爲非法3. –

+2

注意,它不只是比'1'更大,這大於一切整數。 –

+3

就這樣更清楚一點,任何序列總是大於任何數字。例如。 'foo> float('inf')'產生'True'。這同樣適用於列表,元組等,以及字典。這並不能解釋理由,但希望它能幫助事情變得更有意義。 –

回答

14

docs

運營商<,>,==,> =,< =和=比較兩個對象的值!這些對象不必具有相同的類型。如果兩者都是數字,則它們被轉換爲通用類型。否則,不同類型的對象總是比較不平等,並且被一致但任意地排序。您可以通過定義一個__cmp__方法或者如第3.4節所述的豐富比較方法(如__gt__)來控制非內建類型對象的比較行爲。

(比較的這種不尋常的定義被用於簡化像在運營商排序和中和不操作的定義。在將來,對不同類型的對象的比較規則都有可能發生變化。)

7

不兼容類型之間的豐富比較基於python2.x中類型的名稱(?),並且已在python3.x中禁用。

無論如何,在python2.x中,排序保證給出特定python實現和版本的相同結果,但排序本身沒有定義。

+3

我也會寫這個。然後我想:「但是」int「>」dict「',爲什麼不是'foo <1'?」 –

+0

@TimPietzcker - 好點...嗯... – mgilson

+6

[5.3。比較](http://docs.python.org/2/library/stdtypes。html#comparisons)指出:「CPython實現細節:除數字以外的其他類型的對象按其類型名排序;不支持正確比較的相同類型的對象按其地址排序。」所以一般情況是這樣,不是數字。奇怪的。 – delnan

3

我認爲這可能是由於比較運算符只需要部分定義爲派生的事實,也就是說,如果您可以測試==和<,那麼您可以派生出其他運算符,即< =(<或==),>不是< =等,所以在foo = {}的情況下,您可以得到:

的Python 2:

>>> foo == 0 
False 
>>> foo < 0 
False 
>>> not (foo <= 0) 
True 
so: 
>>> foo > 0 
True 

蟒蛇3:

>>> foo = {} 
>>> foo < 0 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unorderable types: dict() < int() 
>>> foo > 0 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unorderable types: dict() > int() 
>>> foo == 0 
False 
>>>