浅析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 相关文章推荐
跟老齐学Python之有容乃大的list(1)
Sep 14 Python
python脚本实现xls(xlsx)转成csv
Apr 10 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
May 16 Python
python difflib模块示例讲解
Sep 13 Python
《Python学习手册》学习总结
Jan 17 Python
python使用tornado实现登录和登出
Jul 28 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
Feb 17 Python
python logging模块的使用详解
Oct 23 Python
python爬虫调度器用法及实例代码
Nov 30 Python
python 使用csv模块读写csv格式文件的示例
Dec 02 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
Dec 10 Python
基于Pygame实现简单的贪吃蛇游戏
Dec 06 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
使用PHP强制下载PDF文件示例
2014/01/17 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
php操作redis命令及代码实例大全
2020/11/19 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
2017/11/27 Javascript
原生js实现拖拽功能基本思路详解
2018/04/18 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
原生JavaScript实现的无缝滚动功能详解
2020/01/17 Javascript
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
跟老齐学Python之有容乃大的list(3)
2014/09/15 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
2018/05/11 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
Python网络爬虫之爬取微博热搜
2019/04/18 Python
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
办公室综合文员岗位职责范本
2014/02/13 职场文书
中学生寄语大全
2014/04/03 职场文书
体现团队精神的口号
2014/06/06 职场文书
外贸会计专业自荐信
2014/06/22 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
财务会计实训报告
2014/11/05 职场文书
幼儿园小班家长评语
2014/12/30 职场文书
交通处罚决定书
2015/06/24 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript