Python中看似等价的表达式x与t为何计算结果存在差异?
问题核心原因
两个表达式结果差0.5的本质是搞错了Python的运算符优先级规则,错误给表达式加了不符合语法规则的括号、改变了运算顺序,二者根本不等价。
Python相关运算符优先级规则(从高到低排序,同优先级按从左到右顺序计算)
- 幂运算
**(优先级最高) - 乘、除、整除、取余:
*///%(优先级次之,同级别左到右运算) - 加、减:
+-(优先级最低,同级别左到右运算)
逐式拆解计算过程
原表达式x的计算(实际结果为17.5,最开始以为结果是17属于计算错误)
x = 1 / 2 + 3 // 3 + 4 ** 2
- 第一步:先算最高优先级的幂运算
4**2 = 16 - 第二步:算次高优先级的除法、整除,从左到右依次计算:
1 / 2 = 0.5(Python3中/无论操作数是否为整数,都返回浮点数结果)3 // 3 = 1(//是向下取整的整除运算)
- 第三步:最后算优先级最低的加法,从左到右累加:
0.5 + 1 + 16 = 17.5
对z式的认知错误
误以为z = 1 / 2 + 3 // 3等价于(1/2 +3) // 3 = 3.5//3,这完全不符合优先级规则:
因为//优先级远高于+,不可能先算+再算//。z式的实际计算顺序和x里的对应部分完全一致:先算1/2=0.5、3//3=1,再相加得到0.5+1=1.5,和3.5//3 =1.0的结果本身就差了0.5。
表达式t的计算
t = 3.5 // 3 + 4 ** 2
- 第一步:先算幂运算
4**2=16 - 第二步:算整除
3.5//3 = 1.0(浮点数整除同样向下取整,3.5比3大、比6小,整除结果为1.0) - 第三步:最后算加法
1.0 +16 =17.0
验证代码
可以直接运行以下代码核对每一步结果:
print(f"1/2 的结果:{1/2}") print(f"3//3 的结果:{3//3}") print(f"4**2 的结果:{4**2}") print(f"x的实际运行结果:{1 / 2 + 3 // 3 + 4 ** 2}") print(f"3.5//3 的结果:{3.5//3}") print(f"t的实际运行结果:{3.5 // 3 + 4 ** 2}") print(f"z的实际运行结果:{1 / 2 + 3 // 3}")

内容的提问来源于stack exchange,提问作者EaglesGreen
相关产品推荐
相关产品推荐

