博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1.字符串池化(intern)机制及拓展学习
阅读量:5146 次
发布时间:2019-06-13

本文共 1064 字,大约阅读时间需要 3 分钟。

1.字符串intern机制

用了这么久的python,时刻和字符串打交道,直到遇到下面的情况:

a = "hello"b = "hello"print(a is b)  #--->True print(a == b)  #---> Truea = "hello world"b = "hello world"print(a is b)  # ---> Falseprint(a == b)  # --->True

咦,这是怎么肥事?我们知道 '=='是用来比较两个变量的字面值是否一致,而 'is'是用来比较前后两个变量是否根本就是同一对象,也就是指向同一个内存地址。好吧,不信这个邪,试试用id方法看一下各自的地址。

>> a = 'hello'>>> b = 'hello'>>> id(a)4482507864>>> id(b)4482507864>>> a = 'hello world'>>> b = 'hello world'>>> id(a)4482504112>>> id(b)4482504176

果然是这样,前面的a,b共用对象了,而后面的a,b的就直接当新对象来处理了。一般来说,新对象建立都会直接开辟一个新的内存使用,但这样的就很容易占用资源,造成内存的浪费,所以python中建立了池化(intern)的概念,即对值相同的字符串对象只会保存一份,相当于共用一个字符串池,当需要值相同的字符串的时候(比如标识符),直接从池里拿来用,避免频繁的创建和销毁,提升效率,节约内存。

但是并不是所有的字符串都会采用intern机制。只包含下划线、数字、字母的字符串才会被intern。这也就是我们看到的,为什么后面的例子中的a,b还是以新对象来处理了。

2.整数对象的内存机制

无独有偶,对于数字这种常用的数据类型,也有这样一种类似机制:

a = 1b = 1print(a is b)  # --->Trueprint(a == b)  # ---> Truea = 320b = 320print(a is b)  # --->Falseprint(a == b)  # --->True

难道是个位的整数就是共对象了?也并非如此,python规定了[-5,257)的范围内为小整数池,即这个范围的整数使用时不用再创对象,直接取来用就好。

而对于大整数还是当作正常对象处理,每次使用均创建⼀个新的对象。

 

转载于:https://www.cnblogs.com/robindong/p/9689111.html

你可能感兴趣的文章
Node.js 连接 MySQL
查看>>
那些年,那些书
查看>>
注解小结
查看>>
java代码编译与C/C++代码编译的区别
查看>>
Bitmap 算法
查看>>
转载 C#文件中GetCommandLineArgs()
查看>>
list control控件的一些操作
查看>>
绝望的第四周作业
查看>>
一月流水账
查看>>
npm 常用指令
查看>>
判断字符串在字符串中
查看>>
Linux环境下Redis安装和常见问题的解决
查看>>
HashPump用法
查看>>
cuda基础
查看>>
Vue安装准备工作
查看>>
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>
Xcode5和ObjC新特性
查看>>
LibSVM for Python 使用
查看>>
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>