我想回答这个问题只是为了好奇。在以下数学表达式中(以及类似的):
(( (3 * 7) + 5 * ((3 - 7) + (3 * 4))) + 9)
Run Code Online (Sandbox Code Playgroud)
Python 是先评估(3 - 7)还是(3 * 4)先评估?关于这一点的事情是,这些最里面的括号确实可以按任一顺序进行评估并获得相同的结果。但是使用哪个顺序?
在这一点上,我正在考虑在实际的 Python 解释器中放置一个断点,看看我是否能想出任何类型的答案(关于解析树是如何生成的)。一直在询问 IRC 等,但无济于事。谢谢你的时间。
您可以检查字节码以查看左侧是首先评估的:
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)