intern机制:
字符串类型作为Python中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化,例如:Python解释器中使用了 intern(字符串驻留)的技术来提高字符串效率,什么是intern机制?即值同样的字符串对象仅仅会保存一份,放在一个字符串储蓄池中,是共用的,当然,肯定不能改变,这也决定了字符串必须是不可变对象。
简单原理:
实现 Intern 机制的方式非常简单,就是通过维护一个字符串储蓄池,这个池子是一个字典结构,如果字符串已经存在于池子中就不再去创建新的字符串,直接返回之前创建好的字符串对象,如果之前还没有加入到该池子中,则先构造一个字符串对象,并把这个对象加入到池子中去,方便下一次获取。
但是,解释器内部对intern 机制的使用策略是有考究的,有些场景会自动使用intern ,有些地方需要通过手动方式才能启动,看下面几个常见的小陷阱。
>>> s1="hello" >>> s2="hello" >>> s1 is s2 True# 如果有空格,默认不启用intern机制 >>> s1="hell o" >>> s2="hell o" >>> s1 is s2 False# 如果一个字符串长度超过20个字符,不启动intern机制 >>> s1 = "a" * 20 >>> s2 = "a" * 20 >>> s1 is s2 True >>> s1 = "a" * 21 >>> s2 = "a" * 21 >>> s1 is s2 False >>> s1 = "ab" * 10 >>> s2 = "ab" * 10 >>> s1 is s2 True >>> s1 = "ab" * 11 >>> s2 = "ab" * 11 >>> s1 is s2 False
s1 = "hell o" s2 = "hell o" print(s1 is s2) # True s1 = "hell!*o" s2 = "hell!*o" print(s1 is s2) # True s1 = "a" * 20 s2 = "a" * 20 print(s1 is s2) # True s1 = "a" * 21 s2 = "a" * 21 print(s1 is s2) # False s1 = "ab" * 10 s2 = "ab" * 10 print(s1 is s2) # True s1 = "ab" * 11 s2 = "ab" * 11 print(s1 is s2) # False
>>> s1 = "hell" >>> s2 = "hello" >>> s1 + "o" is s2 False >>> "hell" + "o" is s2 True >>> # 说明shell和IDE在这方面没有差异 s1 = "hell" s2 = "hello" print(s1 + "o" is s2) # False print("hell" + "o" is s2) # True#因为"hell" + "o"在编译时已经变成了"hello",而s1+"o"因为s1是一个变量,他们会在运行时进行拼接,所以没有被intern
作者:Nobita Chen
出处:http://www.cnblogs.com/chenshengkai/
以上就是浅析Python中字符串的intern机制的详细内容,更多关于python 字符串的intern机制的资料请关注亿速云其它相关文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。