【发布时间】:2019-11-10 02:18:18
【问题描述】:
我在 python 解释器中玩弄逻辑表达式,我似乎无法弄清楚 python 到底在使用什么执行过程。我已经看到这张表 (http://www.mathcs.emory.edu/~valerie/courses/fall10/155/resources/op_precedence.html) 描述了 python 使用的运算符优先级。
1)
print("this") or True and 1/0 and print("tester")
当我在 python 解释器中输入它时,我得到“this”的输出,然后是零除错误。但是,我引用的网站提到函数调用是第二高优先级,所以不应该先执行 print 的两个函数调用吗?我知道有短路评估,但不是只有在你达到 ands、nots 和 ors 的优先级后才会生效吗?
2)
True>False or print("hello")
即使这在 python 解释器上也只输出 True 。为什么不先调用 print 的函数呢?
3)
5 is 5 or 1/0
这会输出 True。但是除法的优先级不应该高于“is”吗?这个表达式不应该返回 ZeroDivsionError 吗?
有人可以解释我缺少什么以及如何判断 python 将按什么顺序执行逻辑表达式吗?
【问题讨论】:
-
据我了解,优先顺序并不意味着评估顺序。解析器使用优先级来构造解析树(然后是语法树或一些 IR)。同样,这只是我的理解,我不知道 Python 是否也是如此。
-
优先级不会取代逻辑运算符/短路。它只是指定在评估之前将哪些优先表达式组合在一起。
-
在
X or Y和X and Y中,X总是首先被评估,而不管Y中使用什么操作。否则不可能短路。 -
既然您已经了解短路评估,请查看stackoverflow.com/questions/46506098/…
-
好的,我想我已经掌握了这个窍门,谢谢大家!感谢您指出我的答案@Arne,这让事情变得更加清晰
标签: python python-3.x operators logical-operators operator-precedence