Python中字符串乘法的工作原理及is判断结果差异原因是什么?
Python字符串乘法运行机制与
is结果差异说明 核心前提
is运算符的作用是判断两个对象是否指向同一块内存地址,和判断值是否相等的==逻辑完全不同。- Python 存在常量折叠和字符串驻留两个优化机制,是这个现象的核心原因。
具体原因分析
1. 'a'*2 is 'a'*2返回True的原因
当乘法的两个操作数都是编译阶段就能确定值的字面量时,Python解释器会在编译代码的阶段直接计算出'a'*2的结果'aa',同时对于这类长度较短、仅由安全ASCII字符组成的字符串,Python会自动做驻留处理,也就是全局只保留一份相同值的字符串对象重复使用,所以两次'a'*2拿到的是同一个内存地址的对象,is判断返回True。
2. 'a'*2 is 'a'*n返回False的原因
这个表达式里的n是变量,编译阶段无法确定n的实际值,所以'a'*n的计算逻辑会推迟到程序运行阶段执行,运行阶段动态生成的字符串默认不会自动触发驻留复用,会新开辟一块内存空间存储生成的'aa',和编译阶段生成的'aa'内存地址不同,所以is判断返回False。
补充验证
如果手动驻留运行期生成的字符串,结果就会变成True:
>>> import sys >>> n = 2 >>> 'a'*2 is sys.intern('a'*n) True
内容的提问来源于stack exchange,提问作者Artur B
相关产品推荐
相关产品推荐

