1.字符串池化(intern)机制及拓展学习
Posted robindong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.字符串池化(intern)机制及拓展学习相关的知识,希望对你有一定的参考价值。
1.字符串intern机制
用了这么久的python,时刻和字符串打交道,直到遇到下面的情况:
a = "hello" b = "hello" print(a is b) #--->True print(a == b) #---> True a = "hello world" b = "hello world" print(a is b) # ---> False print(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 = 1 b = 1 print(a is b) # --->True print(a == b) # ---> True a = 320 b = 320 print(a is b) # --->False print(a == b) # --->True
难道是个位的整数就是共对象了?也并非如此,python规定了[-5,257)的范围内为小整数池,即这个范围的整数使用时不用再创对象,直接取来用就好。
而对于大整数还是当作正常对象处理,每次使用均创建?个新的对象。
以上是关于1.字符串池化(intern)机制及拓展学习的主要内容,如果未能解决你的问题,请参考以下文章
ORA-00600: internal error code, arguments: [25027], [1], [0], [], [], [], [], [], [], [], [], [](代码片
java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法
React拓展 - setState - 路由组件懒加载 - Hooks - Fragment - Context - PureComponent - 插槽 - 错误边界 - 组件通信方式总结(代码片
安装npm后,nrm ls 报错internal/validators.js:124 throw new ERR_INVALID_ARG_TYPE(name, ‘string‘, value)(代码片