Incomputer science, string interning is a method of storing only onecopy of each distinct string value, which must be immutable.
Interning strings makes some stringprocessing tasks more time- or space-efficient at the cost of requiring moretime when the string is created or interned. The distinct values are stored ina string intern pool. --引自维基百科

也就是说,值同样的字符串对象仅仅会保存一份。是共用的,这也决定了字符串必须是不可变对象。想一想。就跟数值类型一样,同样的数值仅仅要保存一份即可了,不是必需用不同对象来区分。

python中的字符串採用了intern机制。会自己主动intern。

>>a = 'kzc'

>>b = 'k'+'zc'

>>id(a)

55704656

>>id(b)

55704656

能够看到。它们是同一个对象。

intern机制的优点是。须要值同样的字符串的时候(比方标识符)。直接从池里拿来用。避免频繁的创建和销毁。提升效率,节约内存。缺点是,拼接字符串、对字符串改动之类的影响性能。

由于是不可变的。所以对字符串改动不是inplace操作。要新建对象。

这也是为什么拼接多字符串的时候不建议用+而用join()。join()是先计算出全部字符串的长度,然后一一拷贝,仅仅new一次对象。

须要小心的。并非全部的字符串都会採用intern机制。仅仅包括下划线、数字、字母的字符串才会被intern。

>>a = 'hello world'

>>b = 'hello world'

>>id(a)

56400384

>>id(b)

56398336

这里由于有空格,全部没被intern。

可是为什么这么做呢?既然python内置函数intern()能显式对随意字符串进行intern。说明不是实现难度的问题。

答案在源代码stringobject.h中的凝视能够找到,

/* ... ... This is generally restricted tostrings that "looklike" Python identifiers, although the intern() builtincan be used to force interning of any string ... ... */

也就是说。仅仅对那些看起来像是python标识符的进行intern。

以下看另外一个

例1.

>>'kz'+'c' is 'kzc'

True

例2.

>>s1 = 'kz'

>>s2 = 'kzc'

>>s1+'c' is 'kzc'

False

为什么第二个栗子是False,仅仅包括字母啊。不是应该被自己主动intern的么?

这是由于第一个栗子中,'kz'+'c'是在compile time求值的,被替换成了'kzc'.

而第二个栗子。s1+'c'是在run-time拼接的。导致没有被自己主动intern.

什么是string interning(字符串驻留)以及python中字符串的intern机制的更多相关文章

  1. Python中字符串String的基本内置函数与过滤字符模块函数的基本用法

    Python中字符串String的基本内置函数与用法 首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符 ...

  2. Python中字符串的使用

    这篇文章主要介绍python当中用的非常多的一种内置类型——str.它属于python中的Sequnce Type(序列类型).python中一共7种序列类型,分别为str(字符串),unicode( ...

  3. python中字符串的操作方法

    python中字符串的操作方法大全 更新时间:2018年06月03日 10:08:51 作者:骏马金龙 我要评论这篇文章主要给大家介绍了关于python中字符串操作方法的相关资料,文中通过示例代码详细 ...

  4. python中字符串的几种表达方式(用什么方式表示字符串)

    说明: 今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式. python的几种表达方式 1 使用单引号扩起来字符串 ...

  5. Python中字符串的intern机制

    intern机制: 字符串类型作为Python中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化,例如:Python解释器中使用了 intern(字符串驻留)的 ...

  6. python中字符串的四种表达方式

    今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式. python的几种表达方式 1 使用单引号扩起来字符串 > ...

  7. python中字符串操作--截取,查找,替换

    python中,对字符串的操作是最常见的,python对字符串操作有自己特殊的处理方式. 字符串的截取 python中对于字符串的索引是比较特别的,来感受一下: s = '123456789' #截取 ...

  8. Python中字符串的截取,列表的截取

    字符串的截取 Python中的字符串用单引号 ' 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符. 字符串的截取的语法格式如下: 变量[头下标:尾下标] 索引值以 0 为开始值,-1 ...

  9. Python中字符串与字节之间相互转换

    Python中字符串与字节之间相互转换 ​ a = b"Hello, world!" # bytes object b = "Hello, world!" # ...

随机推荐

  1. iOS菜鸟成长笔记(3)——斯坦福公开课学习(1)

    一.iOS四层结构 1.Core OS 是用FreeBSD和Mach所改写的Darwin, 是开源.符合POSIX标准的一个Unix核心.这一层包含或者说是提供了整个iPhone OS的一些基础功能, ...

  2. Android 在Android手机上获取其他应用的包名及版本号

    获取Android手机上其他应用的包名及版本号方法有很多,可以通过AAPT从APK包中直接获取,也可以通过代码在手机上获取.显然,对于产品或者用户来说要获取这些信息,在手机上获取更为简便. 下面我们来 ...

  3. TabHost的自定义

    使用自定义的TabHost可以不用继承TabActicity,但是要注意的是如果使用Activity作为Content的话,有两处代码是一定要加的.不然就会出现RuntimeError,还有在XML布 ...

  4. C++笔试专题一:运算符重载

    一:下面重载乘法运算符的函数原型声明中正确的是:(网易2016校招) A:MyClass operator *(double ,MyClass); B:MyClass operator *(MyCla ...

  5. 瞎折腾-CentOS 7.4 编译4.16.2版kernel 并安装

    CentOS 7.4下 原内核版本: 3.10.0-693.el7.x86_64 改后内核版本: 4.16.2 系统版本: CentOS-7-x86_64-Minimal-1708.iso 运行环境: ...

  6. 24 款必备的 Linux 桌面应用(2016 版)

    作者: Munif Tanjim 译者: LCTT GHLandy | 2016-12-21 08:41   评论: 41 收藏: 13 摘要:Linux 的必备软件有哪些?这将会是一个非常主观的回答 ...

  7. php八大设计模式之观察者模式

    例如在登录时,需要判断用户是第几次登录,登录过于频繁我们就给用户提示异常.根据用户的爱好,在用户登录后给予相应的猜你喜欢.如果都在 登录时判断密码的方法内完成,不符合面向对对象的单一职责.那我们该怎么 ...

  8. Redis-Sentinel原理及配置详解【转】

    https://www.cnblogs.com/zhoujinyi/p/5570024.html

  9. vue15 自定义元素指令、标签指令

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. vue12 循环添加重复数据

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...