You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:54:03