Python 常量折叠原理与实现机制
一、什么是常量折叠
常量折叠(Constant Folding)是 Python 编译器在编译阶段将常量表达式计算为具体值的优化技术。它把能在编译时算出来的东西提前算好,存入常量池,同类型对象往往会被复用。
例如:
x = 2 + 3 + 5 + 7 + 11
# 编译器处理为:x = 28
二、适用类型与限制
1. 可变对象(黑名单)
可变类型因状态可能改变,不会被折叠,否则会导致共享引用带来的副作用。
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 is list2) # False
若允许折叠,修改其中一个变量会影响另一个,破坏数据安全性。
2. 不可变对象(白名单)
不可变类型因状态固定,享受折叠特权,可安全复用。
a = 42
b = 42
print(a is b) # True(小整数池)
s1 = "hello"
s2 = "hello"
print(s1 is s2) # 通常 True(字符串驻留)
t1 = (1, 2)
t2 = (1, 2)
print(t1 is t2) # 可能 True
print(None is None) # True
三、字节码分析
使用 dis 模块查看编译器生成的字节码,观察常量是否被预计算。
import dis
():
x = + +
y = +
z = (, ) + (, )
dis.dis(analyze)

