2728129169 发表于 2021-12-22 22:40:57

一个关于短路逻辑的疑问

问题:求表达式的值?
3 and 5 + True or False
结果是6   但应该先计算5 + True等于6 再计算3 and 6 等于6,最后是6 or False等于6吧?

lightninng 发表于 2021-12-22 23:21:30

有人发了和你完全一样的帖子,差点以为是同一个人~~~
这样吧,我把答案粘过来~~~
先说结论,试验结果和官方文档说的完全一致(当然,这是一句废话。。)
结论是:计算的时候,完全按照从左到右的顺序进行计算,所以严格来说是没有楼主说的那种优先级的,如果说有优先级,那也是严格的从左到右的优先级

先放一个官方文档里关于and 和or 的说明
https://docs.python.org/2/library/stdtypes.html
官方文档的5.2节,详细解释了and 和or 的作用
x or y         if x is false, then y, else x
x and y       if x is false, then x, else y
not x          if x is false, then True, else False

然后我的例子
>>> 5 + 0 and True
True
>>> 5 + (0 and True)
5
>>> 1 or 2 + True
1
>>> 0 or 2 + True
3
>>> 1 or 2 + d    # 注意此处的变量d我并未定义,仍然得到了结果1
1
>>> 0 or 2 + d   
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'd' is not defined

1.从第一个、第二个和第三个例子对比可以,and 前面的部分计算完作为and 连接符左侧的x来进行判断,
2.从第四个和第五个例子可以看到,or连接符左侧如果为真,那么不论右侧是什么都不会运行
and连接符左侧如果为假,那么不论右侧是什么都不会运行
这里可以扩展出一个简化(gaoluan)代码的一个用法
表达式aand 函数b

if 表达式a:
    函数b

上面的两段代码的功能相同,or 也可以这么玩~~~


所以,我个人的理解是,楼主的例子中,图片中的说法,和楼主的说法都不准确
这个例子中实际的运作是这样的3 and 5 + True or False
1.先从左到右进行计算,and左侧是3,所以根据文档的规则x and y       if x is false, then x, else y,这里的x=3是True,所以这个表达式的值应该是and右侧的部分5 + True or False这个表达式的值
2.5 + True or False这个表达式同样从左往右,计算到or的时候, or左侧为5+True=6,根据文档的规则x or y       if x is false, then y, else x,所以这个表达式=6,最后得到整个表达式的值为6

多说一句,虽然看起来好像是先计算了5+True ,但仅仅这样理解是片面的,真正的规则只有一个,就是从左往右进行计算,然后严格按照and 和or 的逻辑判断规则进行计算

以上,如过说的有问题,欢迎讨论,我还是挺喜欢交流的,交流就是学习~~~

无尾熊呀 发表于 2021-12-23 13:43:27

<<3 and 5 + True or False
结果是6   但应该先计算5 + True等于6 再计算3 and 6 等于6,最后是6 or False等于6吧?>>
楼主前半部分是正确的,“+”的运算优先级在这里是最高的,所以第一次运行后是 3and 6 or False,而第二次运行时,先判断“and”,因为3跟6不是0,所以and为Ture,程序运行到6就得出结果,后面的or是不会在运行了。
同理,把楼主的题目改成“3 or Ture and 5 + True”,结果是3.
页: [1]
查看完整版本: 一个关于短路逻辑的疑问