3

可能重复:
为什么表达式 0 < 0 == 0 在 Python 中返回 False?

Python 2 REPL 的以下输出让我感到困惑:

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

If15>10==True被评估为(15>10)==True表达式将简化为print True==True,这显然评估为True。If15>10==True被评估为15>(10==True)表达式简化为15>Falsewhich 也评估为True。这两种解释都与表达式 ( False) 的实际值相矛盾。

我可以理解15>1==True评估 to Truesince1==True是正确的,但对我来说没有任何解释是15>10==True有意义的。

摘要:在 Python 2 中,为什么15>10==True计算结果为False

4

2 回答 2

5

这是因为Python 中的链式比较。即,15>10==True实际上被评估为:

15 > 10 and 10 == True

这是False

另一方面,15>1==True

15 > 1 and 1 == True

评估为True


引用文档:

与 C 不同,Python 中的所有比较操作都具有相同的优先级,低于任何算术、移位或按位操作。同样与 C 不同的是,像 a < b < c 这样的表达式具有数学中的常规解释:

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

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

比较可以任意链接,例如,x < y <= z 等价于 x < y 和 y <= z,除了 y 只计算一次(但在这两种情况下,当找到 x < y 时根本不计算 z是假的)。

形式上,如果 a, b, c, ..., y, z 是表达式并且 op1, op2, ..., opN 是比较运算符,则 a op1 b op2 c ... y opN z 等价于 a op1 b和 b op2 c 和 ... y opN z,除了每个表达式最多计算一次。

请注意,a op1 b op2 c 并不意味着 a 和 c 之间的任何类型的比较,因此,例如,x < y > z 是完全合法的(尽管可能不漂亮)。

于 2012-10-31T00:52:21.847 回答
2

我相信您在不知不觉中遇到了 python运算符的“整洁”功能:

与 C 不同,像 a < b < c 这样的表达式具有数学中的常规解释:

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

在这个表达式中,True 恰好被视为 1,即:

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

但是然后在 > 运算符中将 == 替换为,我们会根据上面引用的规则看到新表达式如何为真:

In [14]: 15>10>1
Out[14]: True
于 2012-10-31T00:53:47.873 回答