2012-10-31 69 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