Python中的字符串驻留机制
字符串驻留机制(引用计数机制):
字符串驻留是一种在内存中仅保存一份相同且不可变字符串的方法。系统维护interned字典,记录已被驻留的字符串对象。对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副本。长字符串不遵守驻留机制。python的引用计数机制,并不是对所有的数字,字符串,它只对“ [0-9] [a-z] [A-Z]和"_"(下划线) ”有效,当字符串中由其他字符比如“! @ # ¥ % -”时字符驻留机制是不起作用的。
字符串长度为0或1时,默认采用驻留机制; 字符串长度大于1时,且字符串中只包含大小写字母、数字、下划线(_)时,采用驻留机制; 对于[-5,256]之间的整数数字,Python默认驻留; 字符串只在编译时进行驻留,而非运行时。Python是解释型语言,但是事实上,它的解释器也可以是理解为是一种编译器,它负责将Python代码翻译成字节码,也就是.pyc文件; 用乘法得到的字符串,如果结果长度 <=20且字符串只包含数字、字母大小写、下划线,支持驻留。长度>20,不支持驻留。这样的设计目的是为了保护.pcy文件不会被错误代码搞的过大。
>>> str1='sten_waves'
>>> str2='sten_waves'
>>> str1 is str2
True
>>> id(str1)
2072034398512
>>> id(str2)
2072034398512
>>> str3='sten waves'
>>> str4='sten waves'
>>> str3 is str4
False
>>> id(str3)
2072034399920
>>> id(str4)
2072034399856
例子1与例子2可以看出,非数字、字符串、下划线(_)组成的字符串不会触发驻留。
>>> str1='sten'+'waves' # compile_time
>>> str1 is 'stenwaves'
True>>> str3='sten'
>>> str4=str3+'waves'
>>> str4 is 'stenwaves' # run_time
False
python标识符的不可变性导致了字符串的改动不是采用replace,而是重新创建对象。为了节省内存,设计字符串的改动通常用join()而非+,因为+会多次创建对象,而join()只创建一次对象。 驻留机制会提升一些时间和空间上的性能,但驻留对象也有所消耗。
>>> import sys
>>> a="a*&&"
>>> b="a*&&"
>>> a is b
False
>>> a=sys.intern(b)
>>> a is b
True
2、Python中整型对象存储的位置:
在python中,整形对象存储的位置有所不同,有些整形是预先分配的,一致在内存里,而其他的则在使用时开辟空间。
对于[-5,256]之间的整数数字,Python默认驻留,即预先在内存中分配;
参考:
https://blog.csdn.net/stenwaves/article/details/81879668 Python中的字符串驻留机制
https://www.jianshu.com/p/9660f399ac98 Python的字符串驻留机制
https://blog.csdn.net/weixin_43336281/article/details/106053852 理解Python中整型对象存储的位置
Python中的字符串驻留机制相关推荐
- Python中的字符串驻留
C#中的字符串驻留 熟悉.NET的人都应该知道C#中的字符串驻留机制,.NET维护了一个驻留池,它会把在编译期间就相同的字符串只保留一份拷贝.如果仅在运行期间值才相同的字符串变量,.NET不会为这个2 ...
- Python基础19 字符串驻留机制以及驻留机制的优缺点
文章目录 一.字符串的驻留机制 二.字符串驻留机制的优缺点 一.字符串的驻留机制 """ 字符串是基本数据类型,不可变的字符序列 字符串驻留机制: 相同且不可变的字符串只 ...
- 【Python】Python中神奇的字符串驻留机制
今天有一个初学者在学习Python的时候又整不会了. 原因是以下代码: a = [1, 2, 3] b = [1, 2, 3] if a is b: print("a and b point ...
- python字符串驻留机制_Python中的字符串驻留
C#中的字符串驻留 熟悉.NET的人都应该知道C#中的字符串驻留机制,.NET维护了一个驻留池,它会把在编译期间就相同的字符串只保留一份拷贝.如果仅在运行期间值才相同的字符串变量,.NET才会为这个2 ...
- Java中的字符串驻留
转自:http://www.cdtarena.com/javapx/201307/9088.html 最近在工作的时候,一句再正常不过的代码String a = "hello" + ...
- java 字符串驻留_Java中的字符串驻留
最近在工作的时候,一句再正常不过的代码String a = "hello" + "world";被改成了new StringBuilder().append(& ...
- java 字符串驻留_【Java中的字符串驻留】
最近在工作的时候,一句再正常不过的代码String a = "hello" + "world";被改成了new StringBuilder().append(& ...
- Python基础笔记(二)整数缓存、字符串驻留机制、字符串格式化等
1.同一运算符"is"用于判断两个标识符是不是引用同一个对象 a = 1000 b = 1000c = -6 d = -6print(a is b) print(id(a), ...
- python字符串驻留机制_python字符串驻留(intern)机制
进阶之python字符串驻留(intern)机制 字符串驻留机制 对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副本.长字符串不遵守驻留机制. 驻留适用范围 由数字,字符 ...
最新文章
- 数据结构-冒泡排序过程
- 编写DLL所学所思(2)——导出类
- RabbitMQ 相关概念
- SSD浅层网络_目标检测SSD
- 异或运算交换两个整数
- gradle引入子module配置_原创 | 看完此文,你对Gradle的理解又升级了
- SIPp web frontend(2)
- 算法研究:插入类排序(简单插入,折半插入,希尔排序)
- 【HTML】使用css3和html给网站添加上春节灯笼特效
- xmrig 捐赠修改_四名学生如何通过CommuniGift更改在线捐赠
- 【kafka】Consumer is not subscribed to any topics
- web下拉列表代码_文章列表总结(一)
- sqlserver自定义函数
- clearinterval函数不生效_excel有没有一种技巧或函数让你相见恨晚,如果没有请看这篇文章...
- 数据库用户直接连接pdb
- 输入法编辑器(IME)编程指南
- 封存了一年的网络编程笔记
- 微软出品的Python小白神器,真香
- 车载以太网交换机功能和应用案例汇总, 适用于AVB/TSN, 802.1AS(gPTP时钟同步)
- 系统学习深度学习(四) --CNN原理,推导及实现源码分析
热门文章
- hbw-utils - 关于guava和jdk的compare方法
- C语言 将十六进制字符串转为十六进制数 (二进制、十进制都适用)
- 电视剧植入式广告的植入方式有哪些
- 这几个游戏玩不通关你还算黑客?
- 地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法
- 《写给大家看的设计书(第3版)》
- 一、docker 入坑(win10和Ubuntu 安装)
- 【亲测有效】Linux系统安装NVIDIA显卡驱动
- Windows 局域网间如何共享文件
- 【Few-Shot Segmentation论文阅读笔记】PANet: Few-Shot Image Semantic Segmentation with Prototype , ICCV, 2019