【发布时间】:2015-07-15 04:06:54
【问题描述】:
我的脚本中有一行代码将这两个运算符链接在一起。从文档参考 BOOLEAN AND 的优先级低于 COMPARISON GREATER THAN。我在这段代码中得到了意想不到的结果:
>>> def test(msg, value):
... print(msg)
... return value
>>> test("First", 10) and test("Second", 15) > test("Third", 5)
First
Second
Third
True
我预计第二次或第三次测试会在第一次测试之前发生,因为 > 运算符具有更高的优先级。我在这里做错了什么?
https://docs.python.org/3/reference/expressions.html#operator-precedence
【问题讨论】:
-
第一个值
10的布尔解释也是 True。因此,10 and 15 > 5 == 10 and (15 > 5) == 10 and True == True -
但是为什么解释器在得到 15 或 5 之前得到了 10?比较不应该在布尔检查之前进行吗?
-
test("First", 10) and test("Second", 15) > test("Third", 5)等价于test("First", 10) and (test("Second", 15) > test("Third", 5))Python 也会计算andlazily -
那么优先级绝对正确。
0 and 0 > -1与(0 and 0) > -1不同。我的猜测是,虽然返回的值以正确的顺序进行评估,但由于某种原因,函数没有按该顺序调用。有趣的是,用 0,0,-1 替换 10,15,5 只会打印First。也许这是一个编译器优化 - 因为在你的情况下,正如@Alik 指出的那样,两个订单都会产生相同的值。
标签: python operator-precedence