Python乘法等运算符左右操作数的求值顺序是否有语言级规范?
Python运算符操作数求值顺序问题解答
最终结论
Python语言规范明确强制要求运算符操作数按照从左到右的顺序求值,你提供的代码一定能计算得到30,不存在执行顺序不确定的问题。
规范依据
Python官方语言参考中对表达式求值顺序有明确规定:所有二元运算符的左操作数会先完成完整求值,之后再对右操作数求值,最后执行运算。不存在左操作数求值晚于右操作数的情况,该规则是语言层面的通用要求,和具体Python解释器实现无关。
对应你代码中的len(x) * x.pop()语句,固定执行顺序为:
- 先计算左操作数
len(x),拿到当前列表x的长度 - 再执行右操作数
x.pop(),移除列表最后一个元素并获取返回值 - 最后计算两个值的乘积,累加到
result中
代码执行过程验证
你提供的完整代码如下:
x = [1, 2, 3, 4] result = 0 while x: result += len(x) * x.pop() assert 4**2 + 3**2 + 2**2 + 1**2 == result print(result)
按照规范的求值顺序,循环执行过程为:
- 第一次循环:x长度为4,pop返回4,乘积16,result=16,剩余列表[1,2,3]
- 第二次循环:x长度为3,pop返回3,乘积9,result=25,剩余列表[1,2]
- 第三次循环:x长度为2,pop返回2,乘积4,result=29,剩余列表[1]
- 第四次循环:x长度为1,pop返回1,乘积1,result=30,列表为空退出循环
最终result值等于30,assert语句校验通过,不会抛出异常。
内容的提问来源于stack exchange,提问作者Epimetheus
相关产品推荐
相关产品推荐

