Python 中不易察觉的有趣事实与底层机制解析
提起 Python,绝大多数开发者的第一印象就是'简单'。然而,Python 语言内部存在许多微妙且有趣的机制,如果开发者不深入了解,很容易在编写代码时陷入误区,导致难以排查的 Bug。
本文将深入剖析 Python 中几个容易被忽视的技术细节,帮助你更好地理解解释器的行为。
1. 字符串驻留机制 (String Interning)
在 Python 中,字符串是不可变对象。为了节省内存,CPython 实现了一种优化策略:当创建某些字符串时,解释器会检查是否已存在相同的字符串对象。如果存在,则直接返回已有对象的引用,而不是创建新对象。这种行为被称为'字符串驻留'(String Interning)。
>>> a = "wtf"
>>> b = "wtf"
>>> a is b
True
>>> a = "wtf!"
>>> b = "wtf!"
>>> a is b
False
>>> a, b = "wtf!", "wtf!"
>>> a is b
True
现象分析:
- 为什么加上
!后返回False?因为包含特殊字符的字符串通常不会被隐式驻留。 - 为什么同一行赋值返回
True?因为在编译阶段,解释器会将同一行中的相同字面量合并为一个对象。
驻留规则:
- 长度为 0 或 1 的字符串总是被驻留。
- 仅在编译时确定的字符串(如字面量
'wtf')会被驻留,运行时拼接的(如''.join(['w', 't', 'f']))不会。 - 仅包含字母、数字或下划线的标识符风格字符串更容易被驻留。
手动驻留:
开发者可以使用 sys.intern() 函数强制对字符串进行驻留,这在处理大量重复字符串数据时能显著降低内存占用。
2. is 和 == 的本质区别
很多初学者容易混淆这两个运算符,它们在语义上有本质不同。
is:检查两个变量是否引用同一个内存地址(身份比较)。==:检查两个变量的值是否相等(内容比较)。
>>> [] == []
True
>>> [] is []
False


