浅析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 相关文章推荐
django通过ajax发起请求返回JSON格式数据的方法
Jun 04 Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
python的中异常处理机制
Aug 30 Python
Python中几种属性访问的区别与用法详解
Oct 10 Python
在Python中关于使用os模块遍历目录的实现方法
Jan 03 Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 Python
Python Django Cookie 简单用法解析
Aug 13 Python
python中利用matplotlib读取灰度图的例子
Dec 07 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
Python Selenium库的基本使用教程
Jan 04 Python
python实现socket简单通信的示例代码
Apr 13 Python
Python自动化爬取天眼查数据的实现
Jun 15 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/04/09 欧美动漫
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
详解php中curl返回false的解决办法
2019/03/18 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
关于js类的定义
2011/06/28 Javascript
js取滚动条的尺寸的函数代码
2011/11/30 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
2015/03/18 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
基于javascript实现动态显示当前系统时间
2016/01/28 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
微信小程序 开发之全局配置
2017/05/05 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
原生JS控制多个滚动条同步跟随滚动效果
2017/12/22 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
vue组件(全局,局部,动态加载组件)
2018/09/02 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python编程实现控制cmd命令行显示颜色的方法示例
2017/08/14 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
python实现简易版计算器
2020/06/22 Python
Windows上使用Python增加或删除权限的方法
2018/04/24 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
详解python itertools功能
2020/02/07 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
AmazeUi Tree(树形结构) 应用小结
2020/08/17 HTML / CSS
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
2014年班主任工作总结
2014/11/08 职场文书
英语演讲开场白
2015/05/29 职场文书
个人合作协议范本
2015/08/06 职场文书
银行安全保卫工作总结
2015/08/10 职场文书
创业计划书之电动车企业
2019/10/11 职场文书
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python