浅析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编程之序列操作实例详解
Jul 22 Python
对numpy中布尔型数组的处理方法详解
Apr 17 Python
Pycharm导入Python包,模块的图文教程
Jun 13 Python
python3转换code128条形码的方法
Apr 17 Python
pyqt5 从本地选择图片 并显示在label上的实例
Jun 13 Python
django中SMTP发送邮件配置详解
Jul 19 Python
python实现读取excel文件中所有sheet操作示例
Aug 09 Python
Python笔记之观察者模式
Nov 20 Python
TensorFlow实现checkpoint文件转换为pb文件
Feb 10 Python
Python程序慢的重要原因
Sep 04 Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 Python
python数字类型和占位符详情
Mar 13 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 fread()使用技巧
2010/01/22 PHP
php设计模式 Observer(观察者模式)
2011/06/26 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
Laravel监听数据库访问,打印SQL的例子
2019/10/24 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
javascript实现动态模态绑定grid过程代码
2014/09/22 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
vue + socket.io实现一个简易聊天室示例代码
2017/03/06 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
vue 使用vue-i18n做全局中英文切换的方法
2018/10/29 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
python中set()函数简介及实例解析
2018/01/09 Python
详解python列表生成式和列表生成式器区别
2019/03/27 Python
python集合常见运算案例解析
2019/10/17 Python
css3的@media属性实现页面响应式布局示例代码
2014/02/10 HTML / CSS
阿迪达斯加拿大官网:Adidas加拿大
2016/08/25 全球购物
德国最大的网上鞋店之一:Schuhe24.de
2017/06/10 全球购物
小学教师师德反思
2014/02/03 职场文书
我的老师教学反思
2014/05/01 职场文书
毕业典礼演讲稿
2014/05/13 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
投标文件签署授权委托书范本
2014/10/12 职场文书
企业财务总监岗位职责
2015/04/03 职场文书