1.什么是字符串的驻留机制

字符串驻留:是一种在内存中保存一份且不可变字符串的方法。(相同的字符串只保留一份)
不同的值被存放在字符串的驻留池当中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同的字符串时,不会开辟新的空间,而是把字符串的地址赋给新的创建变量。

a='hello'
b="hello"
c="""hello"""
print(a,id(a))  #hello 2967447375728
print(a,id(b))  #hello 2967447375728
print(a,id(c))  #hello 2967447375728

2.原理:

  1. 系统维护interned字典,记录已被驻留的字符串对象

  2. 当字符串对象需要驻留时,先在interned检测是否存在,若是存在的字符串对象,引用数-1
    不存在则记录到interned中

3.驻留机制的优缺点:

背景:python 一切皆对象,频繁的创建和销毁对象会影响性能
优点:当需要值相同的字符串时候,可以直接从字符串池拿来使用,避免频繁的创建和销毁,提升效率和节约内存。
缺点:创建驻留机制的字符串要花费更多的时间

4.驻留机制的几种情况(交互模式)

这里强调交互模式,是因为pycharm等平台对字符串做了优化,本来不符合的字符串也会指向同一个位置

  • 字符串长度为0或者1
  • 符合标识符的字符串(只包含字符数字下划线)
  • 字符串只在编译时进行驻留,而非运行时
  • [-5,256]之间的整数数字

实列

  • 字符串长度为0时
Python 3.7.7 (tags/v3.7.7:d7c567b08f, Mar 10 2020, 10:41:24) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s1=''
>>> s2=''
>>> s1 is s2
True
>>>
  • 字符串长度为1时
>>> s1='%'
>>> s2='%'
>>> s1 is s2
True
  • 符合标识符的字符串
>>> s1='abc_'
>>> s2='abc_'
>>> s1 is s2
True>>> s1='abc%'
>>> s2='abc%'
>>> s1 is s2
False   #s1 和 s2 不符合标识符的规则
  • 字符串只在编译时进行驻留,而非运行时
>>> a='xyz'
>>> b='xy'+'z'  #编译时
>>> c=''.join(['xy','z']) #运行时
>>> a is b
True
>>> a is c
False
>>>
  • [-5,256]之间的整数数字
False
>>> s1=-5
>>> s2=-5
>>> s1 is s2
True
>>> s1=-6
>>> s2=-6
>>> s1 is s2
False
>>>

5.强制驻留 sys.intern

sys 中的 intern方法强制两个字符串指向一个对象

>>> import sys
>>> s1='abc%'
>>> s2='abc%'
>>> s1 is s2
False
>>> s1=sys.intern(s2)
>>> s1 is s2
True
>>>

python学习-字符串的驻留机制相关推荐

  1. Python中字符串的驻留机制和常用方法

    在python中字符串是基本数据类型,是一个不可变的字符序列. 字符串的驻留机制 使用三种不同的赋值方式赋值同一个字符串 a = 'python' b = "python" c = ...

  2. python学习 字符串函数

    python学习 字符串函数 字符串不能被改变,以下和函数,只是 原字符串初始化后不能改变,函数只是将改变后的值返回赋给新的变量(当然可以赋给原来的变量) 大小写函数 capitalize()函数 大 ...

  3. python学习-字符串格式化

    字符串格式化 使用占位符 使用大括号 使用大括号+自定义名称 使用f-string直接引用变量 使用占位符 常用的占位符如%s %d等,需要严格按照数据类型对应占位符 name = "pyt ...

  4. Python学习:垃圾回收机制

    Python 程序在运行的时候,需要在内存中开辟出一块空间,用于存放运行时产生的临时变量:计算完成后,再将结果输出到永久性存储器中.如果数据量过大,内存空间管理不善就很容易出现 OOM(out of ...

  5. python学习-字符串的基本操作

    文章目录 字符串 字符串定义 字符串下标 字符串的加法 字符串的减法-非常规意义的减法 字符串的乘法 字符串的除法-非常规意义的除法(未完待续...) 说明:目前由于对python语法以及命名规则还不 ...

  6. Python学习 字符串拼接,pycharm再探索,记录一个异常,Python高维矩阵切片索引

    文章目录 字符串拼接 解决了一个异常 矩阵/数组索引 数组 矩阵 三维矩阵 四维矩阵 打印分割线 字符串拼接 parts = ['Is', 'Chicago', 'Not', 'Chicago?'] ...

  7. python学习-字符串

    一.基本数据类型 int 整数 bool 布尔 str 字符串 list 列表 tuple 元组 .dict 字典 set 集合 二.int 类型的操作 bit_length() 返回二进制长度 三. ...

  8. Python学习——字符串切片步长为负值时

    使用[M: N: K]根据步长对字符串切片 <字符串>[M: N],M缺失表示至开头,N缺失表示至结尾 "〇一二三四五六七八九十"[:3] 结果是    "〇 ...

  9. python字符串驻留机制_Python中的字符串驻留

    C#中的字符串驻留 熟悉.NET的人都应该知道C#中的字符串驻留机制,.NET维护了一个驻留池,它会把在编译期间就相同的字符串只保留一份拷贝.如果仅在运行期间值才相同的字符串变量,.NET才会为这个2 ...

最新文章

  1. C++、嵌入式软开之指针
  2. php 自动发送邮件的实现
  3. app——分享wap站,数据处理页面展示
  4. 大数据挑战赛(大佬篇)
  5. P4827 [国家集训队] Crash 的文明世界
  6. linux 百度地图离线sdk,Android开放百度地图集成
  7. 国内PHP,ASP免费开源的CMS介绍
  8. SQL Server常用的字符串/日期/系统函数
  9. 十次方项目登陆问题 token令牌解析,claims获取不到userid,求大神帮忙看下代码解决问题
  10. pancakeswap 开盘抢跑机器人 (附代码)
  11. linux执行 ifconfig 命令 eth0没有IP地址(intet addr、Bcast、Mask)
  12. java学习之路2--简单工厂模式实现饮料自动贩卖机
  13. Python人脸识别项目-人脸识别-获取人脸图片
  14. 解决SVN文件不显示绿色小钩图标问题
  15. 我想做个读APPLE手机SN码的程序。
  16. 最短路计数(入门最短路)
  17. 长江实业全新超甲级商业地标 长江集团中心二期设计理念以人为本
  18. C++转换构造函数和隐式转换函数
  19. 自己对通信系统中的一些参数以及概念的理解
  20. Nginx + Tomcat 实现负载均衡

热门文章

  1. input只能输入英文
  2. 注塑机摆放间距多少合适_选用注塑机的基本原则
  3. 二级题库(C语言)------ 第三套题
  4. 2018年中国500强排行榜
  5. pycharm 专业版 Permanent activation
  6. (原)神卓互联内网穿透远程桌面方法
  7. 2022-6-13 咒语和药水的成功对数,替换字符后匹配,统计得分小于 K 的子数组数目,......
  8. 计算机特色的小游戏,宅家必备小游戏-steam小型游戏推荐
  9. 可重复读隔离级别如何解决脏读、不可重复读
  10. rtmp直播协议介绍