浅析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 smtplib模块发送SSL/TLS安全邮件实例
Apr 08 Python
Python复制文件操作实例详解
Nov 10 Python
Python实现堆排序的方法详解
May 03 Python
python中set()函数简介及实例解析
Jan 09 Python
Python单向链表和双向链表原理与用法实例详解
Aug 31 Python
django rest framework serializer返回时间自动格式化方法
Mar 31 Python
tensorflow常用函数API介绍
Apr 19 Python
Python批量处理csv并保存过程解析
May 16 Python
PyChon中关于Jekins的详细安装(推荐)
Dec 28 Python
聊聊python在linux下与windows下导入模块的区别说明
Mar 03 Python
Django模型层实现多表关系创建和多表操作
Jul 21 Python
python基础之类方法和静态方法
Oct 24 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
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
2013/06/01 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
2014/10/15 PHP
PHP实现ASCII码与字符串相互转换的方法
2017/04/29 PHP
改进版通过Json对象实现深复制的方法
2012/10/24 Javascript
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
jQuery插件bxSlider实现响应式焦点图
2015/04/12 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
2015/06/24 Javascript
JS在onclientclick里如何控制onclick的执行
2016/05/30 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
vue的基本用法与常见指令
2017/08/15 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
解决Layui数据表格的宽高问题
2019/09/28 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
JS highcharts动态柱状图原理及实现
2020/10/16 Javascript
vant picker+popup 自定义三级联动案例
2020/11/04 Javascript
python实现xlsx文件分析详解
2018/01/02 Python
Django框架验证码用法实例分析
2019/05/10 Python
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
Python实现带下标索引的遍历操作示例
2019/05/30 Python
python自动化测试无法启动谷歌浏览器问题
2019/10/10 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
Python list和str互转的实现示例
2020/11/16 Python
canvas之自定义头像功能实现代码示例
2017/09/29 HTML / CSS
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
简历的自荐信
2013/12/19 职场文书
建筑文秘专业个人求职信范文
2013/12/28 职场文书
大学生职业生涯设计书
2014/01/02 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
教师工作证明范本
2015/06/12 职场文书