python如何评估这个?

时间:2012-09-05 07:06:13

标签: python evaluation

有人可以解释这些结果是如何可能的(python 2.6):

>>> 1<3>2
True
>>> (1<3)>2
False
>>> 1<(3>2)
False

我认为最后两个中的一个与第一个匹配,但显然第一个语句中的运算符是以某种方式链接的?!

4 个答案:

答案 0 :(得分:9)

您的第一个示例显示comparison chaining1<3>2表示1<3 and 3>2(除了每个表达式仅评估一次)。这适用于Python中的所有比较运算符。

你的第二个例子强制首先评估一个比较,得到一个布尔值,然后将其与剩余的整数进行比较。

答案 1 :(得分:4)

在您的第一个案例中,1<3>2 1实际上小于33大于2,因此True

在您的第二个案例中,(1<3)>2 (1<3)评估为True,表示为1,因此1不大于2。< / p>

在第三种情况1<(3>2)中,1不小于代表True的{​​{1}}。

答案 2 :(得分:2)

最后两个语句将布尔值与整数进行比较:

>>> True > 2
False
>>> 1 < True
False

第一个语句是comparison chaining,它适用于Python中的所有布尔比较。请注意文档:

  

比较产生布尔值:True或False。

通过将表达式的一部分放在括号中,首先对这些部分进行求值,然后最后比较整数和布尔值。

答案 3 :(得分:1)

根据docs

  

与C不同,Python中的所有比较操作都具有相同的优先级,低于任何算术,移位或按位操作的优先级。与C不同,表达式如同&lt; b&lt; c具有数学常规的解释:

     

比较:: = or_expr(comp_operator or_expr)*

     

comp_operator :: =“&lt;” | “&gt;” 中| “==”| “&gt; =”| “&lt; =”| “&LT;&gt;” 中| “!=”                      | “是”[“不是”] | [“not”]“in”

     

比较产生布尔值:TrueFalse

     

比较可以任意链接,例如,x <1。 y&lt; = z等于x&lt; y和y&lt; = z,除了y仅被评估一次(但在两种情况下,当x&lt; y被发现为假时,根本不评估z。)