python学习-字符串的驻留机制
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.原理:
系统维护interned字典,记录已被驻留的字符串对象
当字符串对象需要驻留时,先在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学习-字符串的驻留机制相关推荐
- Python中字符串的驻留机制和常用方法
在python中字符串是基本数据类型,是一个不可变的字符序列. 字符串的驻留机制 使用三种不同的赋值方式赋值同一个字符串 a = 'python' b = "python" c = ...
- python学习 字符串函数
python学习 字符串函数 字符串不能被改变,以下和函数,只是 原字符串初始化后不能改变,函数只是将改变后的值返回赋给新的变量(当然可以赋给原来的变量) 大小写函数 capitalize()函数 大 ...
- python学习-字符串格式化
字符串格式化 使用占位符 使用大括号 使用大括号+自定义名称 使用f-string直接引用变量 使用占位符 常用的占位符如%s %d等,需要严格按照数据类型对应占位符 name = "pyt ...
- Python学习:垃圾回收机制
Python 程序在运行的时候,需要在内存中开辟出一块空间,用于存放运行时产生的临时变量:计算完成后,再将结果输出到永久性存储器中.如果数据量过大,内存空间管理不善就很容易出现 OOM(out of ...
- python学习-字符串的基本操作
文章目录 字符串 字符串定义 字符串下标 字符串的加法 字符串的减法-非常规意义的减法 字符串的乘法 字符串的除法-非常规意义的除法(未完待续...) 说明:目前由于对python语法以及命名规则还不 ...
- Python学习 字符串拼接,pycharm再探索,记录一个异常,Python高维矩阵切片索引
文章目录 字符串拼接 解决了一个异常 矩阵/数组索引 数组 矩阵 三维矩阵 四维矩阵 打印分割线 字符串拼接 parts = ['Is', 'Chicago', 'Not', 'Chicago?'] ...
- python学习-字符串
一.基本数据类型 int 整数 bool 布尔 str 字符串 list 列表 tuple 元组 .dict 字典 set 集合 二.int 类型的操作 bit_length() 返回二进制长度 三. ...
- Python学习——字符串切片步长为负值时
使用[M: N: K]根据步长对字符串切片 <字符串>[M: N],M缺失表示至开头,N缺失表示至结尾 "〇一二三四五六七八九十"[:3] 结果是 "〇 ...
- python字符串驻留机制_Python中的字符串驻留
C#中的字符串驻留 熟悉.NET的人都应该知道C#中的字符串驻留机制,.NET维护了一个驻留池,它会把在编译期间就相同的字符串只保留一份拷贝.如果仅在运行期间值才相同的字符串变量,.NET才会为这个2 ...
最新文章
- C++、嵌入式软开之指针
- php 自动发送邮件的实现
- app——分享wap站,数据处理页面展示
- 大数据挑战赛(大佬篇)
- P4827 [国家集训队] Crash 的文明世界
- linux 百度地图离线sdk,Android开放百度地图集成
- 国内PHP,ASP免费开源的CMS介绍
- SQL Server常用的字符串/日期/系统函数
- 十次方项目登陆问题 token令牌解析,claims获取不到userid,求大神帮忙看下代码解决问题
- pancakeswap 开盘抢跑机器人 (附代码)
- linux执行 ifconfig 命令 eth0没有IP地址(intet addr、Bcast、Mask)
- java学习之路2--简单工厂模式实现饮料自动贩卖机
- Python人脸识别项目-人脸识别-获取人脸图片
- 解决SVN文件不显示绿色小钩图标问题
- 我想做个读APPLE手机SN码的程序。
- 最短路计数(入门最短路)
- 长江实业全新超甲级商业地标 长江集团中心二期设计理念以人为本
- C++转换构造函数和隐式转换函数
- 自己对通信系统中的一些参数以及概念的理解
- Nginx + Tomcat 实现负载均衡