Python Literals字面量求值规则:同值对应不同对象相关疑问
问题澄清与解答
1. 同值字面量为何可能得到值相同的不同对象?
这是Python解释器的对象驻留优化属于实现层面的可选行为,没有语法层面的强制约束:
- 对于小整数、无特殊字符的短字符串这类常用值,解释器一般会默认驻留,多次出现的同值字面量会复用同一个内存对象
- 对于长字符串、带空格/特殊符号的字符串、大尺寸的容器类字面量(比如长列表/大字典字面量),解释器通常不会做驻留优化,每次求值字面量都会新开辟内存创建对象,就会出现值完全相同、但内存地址不同的两个独立对象
你示例中的长字符串开头带有空格,不属于默认驻留的范围,因此#1和#3两个同值字面量求值后,得到的就是两个不同对象,你可以通过id()函数验证:两次打印返回的字符串的id,结果会不一致。
2. 「程序文本中的同一次出现/不同次出现」如何区分?
区分标准就是字面量在源代码里的物理位置:
- 同一次出现:指源代码里同一个位置的同一个字面量,最典型的就是循环体内的字面量,比如下方代码里的
"test string",不管循环执行10次还是100次,这个字面量在代码里只写了一次,属于同一次出现:
for _ in range(10): s = "test string" # 这是同一个字面量的同一次出现
- 不同次出现:指源代码里两个不同位置写的、内容完全相同的字面量,你示例里的#1和#3就是典型的不同次出现,两个字面量写在了两行不同的输入代码里。
3. 字面量出现情况和求值结果的关联
文档的表述是为了明确:Python没有任何规则保证同值字面量求值一定会返回同一个对象,不管是同一次还是不同次出现:
- 同一次出现的字面量:绝大多数场景下解释器会复用同一个对象,比如上述循环里的字符串,10次循环拿到的都是同一个对象;但极端场景下(比如解释器内存回收策略触发、或者部分特殊类型的字面量)也可能出现多次求值返回不同对象的情况
- 不同次出现的字面量:结果完全取决于解释器的优化策略,属于驻留范围的类型就返回同一个对象,不属于驻留范围的就返回不同对象,开发者不应该依赖这个行为来做身份判断(也就是不要用
is来判断两个字面量的值是否相等,应该用==)
内容的提问来源于stack exchange,提问作者Aga Qul
相关产品推荐
相关产品推荐

