浅析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学习笔记 下载
Feb 10 Python
python实现网页链接提取的方法分享
Feb 25 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
用python写一个windows下的定时关机脚本(推荐)
Mar 21 Python
Python 反转字符串(reverse)的方法小结
Feb 20 Python
python矩阵的转置和逆转实例
Dec 12 Python
Django实现学生管理系统
Feb 26 Python
Opencv实现抠图背景图替换功能
May 21 Python
python 匿名函数与三元运算学习笔记
Oct 23 Python
selenium判断元素是否存在的两种方法小结
Dec 07 Python
python利用opencv实现颜色检测
Feb 23 Python
Django数据库(SQlite)基本入门使用教程
Jul 07 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
php正则表达匹配中文问题分析小结
2012/03/25 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
jQuery判断元素是否存在的可靠方法
2014/05/06 Javascript
JavaScript检测字符串中是否含有html标签实现方法
2015/07/01 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
2016/05/10 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
JavaScript中三个等号和两个等号你了解多少
2017/07/04 Javascript
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
js通过Date对象实现倒计时动画效果
2017/10/27 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
2019/01/18 Javascript
node.js通过url读取文件
2020/10/16 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
详解Python装饰器由浅入深
2016/12/09 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
python DataFrame 取差集实例
2019/01/30 Python
django框架创建应用操作示例
2019/09/26 Python
Python自动化xpath实现自动抢票抢货
2020/09/19 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
学生的自我鉴定范文
2013/10/24 职场文书
元旦晚会邀请函
2014/01/27 职场文书
党员作风建设自查报告
2014/10/23 职场文书
2015年三好一满意工作总结
2015/07/24 职场文书
欢送领导祝酒词
2015/08/12 职场文书
党员干部学习心得体会
2016/01/23 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python
Django展示可视化图表的多种方式
2021/04/08 Python
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python
MySQL远程无法连接的一些常见原因总结
2022/09/23 MySQL