什么是常量折叠
常量折叠是 Python 编译器在编译阶段将常量表达式提前计算并存储到常量池的优化技术。例如 x = 2 + 3 会被直接优化为 x = 5,从而减少运行时的计算开销。
适用类型:可变与不可变
不可变对象(支持折叠)
数字、字符串、元组等不可变类型通常享受折叠特权。由于它们的内容无法被修改,编译器可以安全地复用同一个对象实例。
a = 42
b = 42
print(a is b) # True,小整数池驻留
可变对象(不支持折叠)
列表、字典、集合等可变类型因存在共享引用风险,不会被折叠。如果两个变量指向同一内存地址,修改其中一个会影响另一个。
l1 = [1, 2]
l2 = [1, 2]
print(l1 is l2) # False,每次创建新对象
字节码验证
使用 dis 模块查看编译后的字节码,可以直观看到常量是否被折叠。
import dis
def test():
x = 3 + 4
y = "hello" + "world"
z = (1, 2) + (3, 4)
dis.dis(test)
输出显示 LOAD_CONST 指令直接加载计算后的值(如 12),而非执行加法指令。
实验验证
数字驻留
小整数范围(-5 到 256)通常被缓存,超出范围则可能不共享。
字符串驻留
短字符串常驻留,长字符串或包含特殊字符的字符串可能不驻留。
元组折叠
简单元组可能折叠,但包含可变元素的元组绝不折叠。
性能影响
常量折叠能减小 .pyc 文件体积,加快启动速度,节省内存。它让编译器承担了部分运行时工作。
最佳实践
- 比较方式:写代码时大胆用
==比较内容,谨慎用is比较身份。 - 性能敏感:尽量用不可变对象,让编译器帮你优化。
- 调试注意:知道
id()可能会'说谎',多个引用可能指向同一个 ID。

