如何创建两个内存地址不同、值均为"1"的Python字符串对象?
绕过短字符串驻留的实现方案
你可以通过运行时动态生成字符串的方式避开自动驻留机制,以下是几种可直接运行的实现:
方法1:使用chr()内置函数生成
利用ASCII码动态生成目标字符,不会触发自动驻留:
>>> one1 = "1" >>> one2 = chr(49) # 49是字符'1'对应的ASCII编码值 >>> type(one2) is str and one1 == one2 True >>> one1 is one2 False
方法2:通过bytes解码生成
从字节序列解码得到的字符串属于运行时生成,默认不驻留:
>>> one1 = "1" >>> one2 = b"1".decode("ascii") >>> type(one2) is str and one1 == one2 True >>> one1 is one2 False
方法3:通过长字符串切片生成
切片操作得到的子字符串是运行时新生成的实例,不会自动驻留:
>>> one1 = "1" >>> one2 = "_1"[1:] >>> type(one2) is str and one1 == one2 True >>> one1 is one2 False
实现原理
CPython的自动字符串驻留仅对编译期就能确定的符合规则的短字符串生效:只有仅由ASCII字母、数字、下划线组成,且长度不超过阈值的字面量字符串,才会在编译阶段被自动加入驻留池。上述所有方法生成的字符串都是运行时动态计算得到的,不会触发自动驻留逻辑,因此可以得到值完全相同但内存地址不同的字符串实例。
注:上述行为是CPython的实现细节,其他Python解释器实现可能存在差异。
内容的提问来源于stack exchange,提问作者wim
相关产品推荐
相关产品推荐

