2012-10-31 144 views
3

可能重複:
Why does the expression 0 < 0 == 0 return False in Python?意外結果

從Python 2 REPL以下輸出混淆我:

>>> 15>10==True 
False 
>>> 15>1==True 
True 
>>> 15>2==True 
False 
>>> 15>False 
True 

如果15>10==True被評估如(15>10)==True,表達式將簡化爲print True==True,顯然評估爲True。如果15>10==True被評估爲15>(10==True),則表達式簡化爲15>False,其也評估爲True。這兩種解釋都與表達的實際價值(False)相抵觸。

我能理解,因爲15>1==True評估1==TrueTrue是真實的,但沒有解釋15>10==True對我來說很有意義。

摘要:在Python 2中,爲什麼15>10==True評估爲False

回答

5

這是因爲Python中的chained comparison。即,15>10==True實際上評價爲:

15 > 10 and 10 == True 

這是False

在另一方面,15>1==True相同

15 > 1 and 1 == True 

計算結果爲True


爲了從文檔引用:

不同於C,在Python所有比較操作具有相同的優先級,這比任何算術下,移位或按位操作。也不像C,像< b <表達式c具有即在數學常規的解釋:

comparison ::= or_expr (comp_operator or_expr)* 
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!=" 
        | "is" ["not"] | ["not"] "in" 

比較得到的布爾值:真或假。

比較可以被任意鏈的,例如,x <ÿ< = z是等效於x < y和y < = Z,不同的是y爲只計算一次(但在這兩種情況下Z不是在所有當x評價y被發現是錯誤的)。如果a,b,c,...,y,z是表達式,op1,op2,...,opN是比較運算符,則op1 b op2 c ... y opN z是等效的到op1 b和b op2 c和... y opN z,除了每個表達式至多被評估一次。

請注意,op1 b op2 c並不意味着在a和c之間進行任何類型的比較,因此,例如,x> < y> z是完全合法的(儘管可能並不漂亮)。

2

我beleive你在不知不覺中運行到蟒蛇operators的 「整齊」 的特點:

不像C,像< b <表達c具有即在傳統的數學解釋:

In [12]: 15>10==True 
Out[12]: False 

真發生在該表達式被視爲1,即:

In [13]: 15>10==1 
Out[13]: False 

但隨後在>運營商更換==,我們看到上面按規則援引新的表達式爲true:

In [14]: 15>10>1 
Out[14]: True