我刚刚意识到 CPython 似乎对待表示相同值的常量表达式,在常量折叠方面有所不同。例如:
>>> import dis
>>> dis.dis('2**66')
1 0 LOAD_CONST 0 (2)
2 LOAD_CONST 1 (66)
4 BINARY_POWER
6 RETURN_VALUE
>>> dis.dis('4**33')
1 0 LOAD_CONST 2 (73786976294838206464)
2 RETURN_VALUE
对于第二个示例,应用了常量折叠,而对于第一个示例,尽管两者都表示相同的值,但它不是。它似乎与指数的值或结果的大小无关,因为以下表达式也被折叠:
>>> dis.dis('2.0**66')
1 0 LOAD_CONST 2 (7.378697629483821e+19)
2 RETURN_VALUE
>>> dis.dis('4**42')
1 0 LOAD_CONST 2 (19342813113834066795298816)
2 RETURN_VALUE
为什么前两个表达式的处理方式不同,更一般地说,CPython 对常量折叠遵循的具体规则是什么?
测试:
$ python3.6 --version
Python 3.6.5 :: Anaconda, Inc.
$ python3.7 --version
Python 3.7.1