浅析Python中字符串的intern机制


Posted in Python onOctober 03, 2020

intern机制:

字符串类型作为Python中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化,例如:Python解释器中使用了 intern(字符串驻留)的技术来提高字符串效率,什么是intern机制?即值同样的字符串对象仅仅会保存一份,放在一个字符串储蓄池中,是共用的,当然,肯定不能改变,这也决定了字符串必须是不可变对象。

简单原理:

实现 Intern 机制的方式非常简单,就是通过维护一个字符串储蓄池,这个池子是一个字典结构,如果字符串已经存在于池子中就不再去创建新的字符串,直接返回之前创建好的字符串对象,如果之前还没有加入到该池子中,则先构造一个字符串对象,并把这个对象加入到池子中去,方便下一次获取。

但是,解释器内部对intern 机制的使用策略是有考究的,有些场景会自动使用intern ,有些地方需要通过手动方式才能启动,看下面几个常见的小陷阱。

  • 1.在shell中示例,并非全部的字符串都会采用intern机制。仅仅包括下划线、数字、字母的字符串才会被intern,当然不能超过20个字符。因为如果超过20个字符的话,解释器认为这个字符串不常用,不用放入字符串池中。
>>> 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
  • 2.但是在PyCharm中,只要是同一个字符串不超过20个字符,都为True,并不用是下划线、数字、字母的字符串。个人理解:IDE支持的不好。
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
  • 3.字符串拼接时,涉及编译运行问题
>>> 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机制的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python3编写C/S网络程序实例教程
Aug 25 Python
Python中的True,False条件判断实例分析
Jan 12 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
Python 保持登录状态进行接口测试的方法示例
Aug 06 Python
python的mysql数据库建立表与插入数据操作示例
Sep 30 Python
Python中base64与xml取值结合问题
Dec 22 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
Feb 14 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
Jun 15 Python
python实现企业微信定时发送文本消息的示例代码
Nov 24 Python
python中_del_还原数据的方法
Dec 09 Python
Python实现AES加密,解密的两种方法
Oct 03 #Python
python实现AdaBoost算法的示例
Oct 03 #Python
Django创建一个后台的基本步骤记录
Oct 02 #Python
Python中qutip用法示例详解
Oct 02 #Python
如何利用Python给自己的头像加一个小国旗(小月饼)
Oct 02 #Python
Python通过fnmatch模块实现文件名匹配
Sep 30 #Python
Python tempfile模块生成临时文件和临时目录
Sep 30 #Python
You might like
php5.3 注意事项说明
2013/07/01 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
php常量详细解析
2015/10/27 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
用JavaScript编写COM组件的步骤
2009/03/17 Javascript
围观tangram js库
2010/12/28 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
Jquery 切换不同图片示例代码
2013/12/05 Javascript
js的回调函数详解
2015/01/05 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
jQuery查找dom的几种方法效率详解
2017/05/17 jQuery
angular2 ng build部署后base文件路径问题详细解答
2017/07/15 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
2019/04/05 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
2019/09/05 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
Python pandas自定义函数的使用方法示例
2019/11/20 Python
python实现人脸签到系统
2020/04/13 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
python常量折叠基础知识点讲解
2021/02/28 Python
新西兰优惠网站:Treat Me
2019/07/04 全球购物
会计实习期自我鉴定
2013/10/06 职场文书
财务会计人员求职的自我评价
2014/01/13 职场文书
法学专业自我鉴定
2014/02/05 职场文书
端午节活动策划方案
2014/03/09 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
微信小程序和php的登录实现
2021/04/01 PHP
Python深度学习之Pytorch初步使用
2021/05/20 Python
python四种出行路线规划的实现
2021/06/23 Python
Spring Data JPA的Audit功能审计数据库的变更
2021/06/26 Java/Android