Python字典键是否适用字符串驻留(string interning)机制?
Python字典键的字符串驻留机制答疑
首先直接给出对应场景的结论:你举的例子中,不同子字典的同名字面量字符串键'a'/'b'/'c'会指向内存中的同一个地址,默认会触发隐式字符串驻留。
具体规则说明
Python(这里特指主流的CPython实现)的字符串驻留触发逻辑和字符串是否用作字典键没有直接关联,只要符合驻留条件的字符串,不管用在什么场景都会被驻留,默认隐式驻留的触发条件如下:
- 仅由ASCII字母、数字、下划线组成,符合Python标识符命名规范的字符串
- 长度不超过20(常量折叠场景下可放宽到4096,不同版本阈值可能有调整)的短字符串
- 是编译期就能确定的字面量字符串
你举的例子里的'a'/'b'/'c'完全符合上述条件,不管在多少个字典中作为键出现,编译阶段就会被驻留,全局只会保留一份内存实例。
验证示例
你可以用is运算符(判断两个对象是否指向同一个内存地址)直接验证:
dict1 = {'a': 1, 'b': 2, 'c': 3} dict2 = {'a': 4, 'b': 5, 'c': 6} print(next(iter(dict1.keys())) is next(iter(dict2.keys()))) # 输出True,证明键'a'是同一个内存对象
例外情况
如果你的字符串键是运行时动态生成的,没有显式触发驻留的话,就算值相同也不会指向同一个内存地址,示例如下:
import sys key1 = ''.join(['a']) # 运行时动态生成的字符串 key2 = ''.join(['a']) dict1 = {key1: 1} dict2 = {key2: 2} print(key1 is key2) # 输出False,两个字符串地址不同 # 显式驻留后就会变成同一个对象 key1 = sys.intern(key1) key2 = sys.intern(key2) print(key1 is key2) # 输出True
注意:字符串驻留是CPython的实现细节,不是Python语言的强制规范,其他解释器的实现可能存在差异,不要在业务代码中依赖该特性做逻辑判断。
内容的提问来源于stack exchange,提问作者epushor
相关产品推荐
相关产品推荐

