Python 中的算术求值顺序

Jam*_*son 1 python math

我想回答这个问题只是为了好奇。在以下数学表达式中(以及类似的):

(( (3 * 7)  + 5 * ((3 - 7) + (3 * 4))) + 9)
Run Code Online (Sandbox Code Playgroud)

Python 是先评估(3 - 7)还是(3 * 4)先评估?关于这一点的事情是,这些最里面的括号确实可以按任一顺序进行评估并获得相同的结果。但是使用哪个顺序?

在这一点上,我正在考虑在实际的 Python 解释器中放置一个断点,看看我是否能想出任何类型的答案(关于解析树是如何生成的)。一直在询问 IRC 等,但无济于事。谢谢你的时间。

Mis*_*agi 6

您可以检查字节码以查看左侧是首先评估的:

dis.dis("""(a - b) + (c * d)""")
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 BINARY_SUBTRACT
              6 LOAD_NAME                2 (c)
              8 LOAD_NAME                3 (d)
             10 BINARY_MULTIPLY
             12 BINARY_ADD
             14 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

表达式的求值顺序是语言规范的一部分。

评估顺序

Python 从左到右计算表达式。请注意,在评估赋值时,右侧先于左侧进行评估。


请注意,如果您使用文字表达式,例如(3 - 7) + (3 * 4),则不会对其进行评估,而是直接编译。

dis.dis("""(3 - 7) + (3 * 4)""")
  1           0 LOAD_CONST               0 (8)
              2 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)