Python中的短路技术?
对编程新手来说,一个常见的错误是对布尔运算符工作方式的误解,这是由于python解释器读取这些表达式的方式引起的。例如,在最初了解“and”和“or”语句之后,可以假设表达式X=('x'或'y')将检查变量X是否等于字符串'a中的一个'或'b'。事实并非如此。要理解,我要说的是,与解释器开始一个交互式会话,然后输入以下表达式:
>>> 'x' == ('x' or 'y') True >>> 'y' == ('x' or 'y') False >>> 'x' == ('x' and 'y') False >>> 'y' == ('x' and 'y') True
此时,and和or运算符似乎已损坏。对于前两个表达式,“x”等效于“x”或“y”等效是没有意义的。此外,“y”等同于“x”和“y”没有任何意义。在检查了解释器对布尔运算符的处理后,这些结果实际上与您对它们的要求完全相同,这与您认为的要求不同。
如果是或表达式,则python解释器会首先获取第一条语句并检查是否为true。当第一个语句为true时,python将返回该对象的值,而无需考虑第二个参数。这是因为对于or表达式,如果值之一为true,则整个情况为true;否则,结果为true。该程序不会查看第二条语句。但是,如果第一个对象的值计算为false,则python检查第二条语句并返回该值。由于后半部分为假,因此后半部分确定表达式的真值。解释器的这种“懒惰”被称为“短路”,是许多编程语言中评估布尔表达式的常用方式。
同样,对于和表达式,python使用短路技术来加快对真值的评估。如果第一个语句为假,则整个对象必须为假,并返回该对象值(假);否则,如果第一个值为true,则检查第二个值并返回该值。让我们看一下解释器在遍历代码时所“看到的”内容
第一案
'x' == ('x' or 'y') # Look at parentheses first, so evaluates "('x' or 'y")" # 'x' is a nonempty string, so the first value is True >>> 'x' == 'x' # the string 'x' is equivalent to the string 'x' , so our expression is True True
第二种情况
'y' == ('x' or 'y')# Look at parentheses first, so evaluates expression "('x' or 'y')" # 'x' is a nonempty string, so the first value is True #Return that first value : 'x' 'y' == 'x'# the string 'y' is not equivalent to the string 'x', so the expression is False
第三案
>>> 'x' == ('x' and 'y')# Look at parentheses first, so evaluate expression "('x' and 'y')" #'x' is a nonempty string, so the first value is True, examine second value # 'y' is a nonempty string, so second value is True #Return that second value as result of whole expression: 'y' >>> 'x' == 'y'# the string 'x' is not equivalent to the string 'y', so expression is False False
第四种情况
>>> 'y' == ('x' and 'y')# Look at parenthese first, so evaluates expression "('x' and 'y')" True # 'x' is a nonempty string, so the first value is True, examine second value # 'y' is a nonempty string, so second value is True # Return that second value as result of whole expression: 'y' >>> 'y' == 'y'# the string 'y' is equivalent to the string 'y', so expression is True True
短路评估意味着在评估诸如AND和OR之类的布尔表达式时,只要找到满足或否定该表达式的第一个条件,就可以立即停止。
短路由官方文档解释: