Python表达式求值为何始终从左到右?为何expr1先于expr3执行?
Python表达式求值顺序与运算优先级的区别
你混淆了两个核心概念:操作数的求值顺序和运算的优先级,这是完全独立的规则:
运算优先级:决定的是操作符(+、*、-这类)的执行先后顺序。就像你理解的那样,
expr1 + expr2 * (expr3 - expr4)里,确实是先算括号内的expr3 - expr4,再算乘法expr2 * 减法结果,最后算加法expr1 + 乘法结果——这是运算的执行顺序,完全符合算术优先级规则。求值顺序:Python对表达式里的所有操作数,是严格按从左到右的顺序先计算出它们的值的。也就是说,在执行任何运算之前,Python会依次算出
expr1的值,然后expr2的值,接着expr3的值,最后expr4的值。之后才会拿着这些已经求好的值,按照运算优先级去执行减法、乘法、加法。
举个直观的例子就能看明白:
def get_expr1(): print("计算expr1") return 1 def get_expr2(): print("计算expr2") return 2 def get_expr3(): print("计算expr3") return 3 def get_expr4(): print("计算expr4") return 4 result = get_expr1() + get_expr2() * (get_expr3() - get_expr4()) print(result)
运行这段代码,输出顺序是:
计算expr1 计算expr2 计算expr3 计算expr4 -1
你看,操作数的求值是从左到右依次进行的,但运算逻辑还是遵循优先级:先算3-4=-1,再算2*-1=-2,最后算1+(-2)=-1。
简单说,括号只改变运算的执行顺序,不改变操作数的求值顺序——Python会先把所有要用到的操作数从左到右挨个算出值,再按优先级做运算。
内容的提问来源于stack exchange,提问作者chen zhang
相关产品推荐
相关产品推荐

