CPython 3.3+ 引入 Compact Strings(紧凑字符串),三种内部存储模式,每个字符占用字节由最大码点决定。注意,不是变长的,内部存的是定宽单元。
| 模式 | 单字符单元大小 | 适用码点范围 |
|---|---|---|
| 1‑byte (Latin‑1) | 1字节 | U+0000 ~ U+00FF |
| 2‑byte (UCS‑2) | 2字节 | U+0100 ~ U+FFFF |
| 4‑byte (UCS‑4) | 4字节 | U+10000 ~ U+10FFFF(emoji、生僻字) |
举例如下:
s1 = "abc" # 全部 <= U+00FF → 1字节/字符
s2 = "你好" # 汉字 U+4F60 > 0xFF,<=0xFFFF → 2字节/字符
s3 = "你好😀" # 😀 U+1F600 超过0xFFFF → 全部升级为4字节/字符s1:每个字符占1字节s2:每个字符占2字节s3:整串全部升级4字节,哪怕只有一个emoji,所有普通汉字也用4字节存储。
这是个关键点:整个字符串统一用同一种单元宽度,不会混合1/2/4字节。只要串里出现一个超大码点,全部字符膨胀到4字节。