字符串驻留机制(引用计数机制):

字符串驻留是一种在内存中仅保存一份相同且不可变字符串的方法。
系统维护interned字典,记录已被驻留的字符串对象。
对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副本。长字符串不遵守驻留机制。
    python的引用计数机制,并不是对所有的数字,字符串,它只对“  [0-9] [a-z] [A-Z]和"_"(下划线)  ”有效,当字符串中由其他字符比如“! @ # ¥ % -”时字符驻留机制是不起作用的。
驻留适用范围:
  1. 字符串长度为0或1时,默认采用驻留机制;
  2. 字符串长度大于1时,且字符串中只包含大小写字母、数字、下划线(_)时,采用驻留机制;
  3. 对于[-5,256]之间的整数数字,Python默认驻留
  4. 字符串只在编译时进行驻留,而非运行时。Python是解释型语言,但是事实上,它的解释器也可以是理解为是一种编译器,它负责将Python代码翻译成字节码,也就是.pyc文件;
  5. 用乘法得到的字符串,如果结果长度 <=20且字符串只包含数字、字母大小写、下划线,支持驻留。长度>20,不支持驻留。这样的设计目的是为了保护.pcy文件不会被错误代码搞的过大。
例子1:带下划线(_)
>>> str1='sten_waves'
>>> str2='sten_waves'
>>> str1 is str2
True
>>> id(str1)
2072034398512
>>> id(str2)
2072034398512

例子2:带空格字符
>>> str3='sten waves'
>>> str4='sten waves'
>>> str3 is str4
False
>>> id(str3)
2072034399920
>>> id(str4)
2072034399856

例子1与例子2可以看出,非数字、字符串、下划线(_)组成的字符串不会触发驻留。

驻留时机:
python中的驻留发生在compile_time,而不是run_time。
>>> str1='sten'+'waves'  # compile_time
>>> str1 is 'stenwaves'
True>>> str3='sten'
>>> str4=str3+'waves'
>>> str4 is 'stenwaves'  # run_time
False

优缺点:
  • python标识符的不可变性导致了字符串的改动不是采用replace,而是重新创建对象。为了节省内存,设计字符串的改动通常用join()而非+,因为+会多次创建对象,而join()只创建一次对象。
  • 驻留机制会提升一些时间和空间上的性能,但驻留对象也有所消耗。
注:
1、Pyhton提供intern方法强制2个字符串指向同一个对象。
>>> 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中的字符串驻留机制相关推荐

  1. Python中的字符串驻留

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

  2. Python基础19 字符串驻留机制以及驻留机制的优缺点

    文章目录 一.字符串的驻留机制 二.字符串驻留机制的优缺点 一.字符串的驻留机制 """ 字符串是基本数据类型,不可变的字符序列 字符串驻留机制: 相同且不可变的字符串只 ...

  3. 【Python】Python中神奇的字符串驻留机制

    今天有一个初学者在学习Python的时候又整不会了. 原因是以下代码: a = [1, 2, 3] b = [1, 2, 3] if a is b: print("a and b point ...

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

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

  5. Java中的字符串驻留

    转自:http://www.cdtarena.com/javapx/201307/9088.html 最近在工作的时候,一句再正常不过的代码String a = "hello" + ...

  6. java 字符串驻留_Java中的字符串驻留

    最近在工作的时候,一句再正常不过的代码String a = "hello" + "world";被改成了new StringBuilder().append(& ...

  7. java 字符串驻留_【Java中的字符串驻留】

    最近在工作的时候,一句再正常不过的代码String a = "hello" + "world";被改成了new StringBuilder().append(& ...

  8. Python基础笔记(二)整数缓存、字符串驻留机制、字符串格式化等

    1.同一运算符"is"用于判断两个标识符是不是引用同一个对象   a = 1000 b = 1000c = -6 d = -6print(a is b) print(id(a), ...

  9. python字符串驻留机制_python字符串驻留(intern)机制

    进阶之python字符串驻留(intern)机制 字符串驻留机制 对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副本.长字符串不遵守驻留机制. 驻留适用范围 由数字,字符 ...

最新文章

  1. 数据结构-冒泡排序过程
  2. 编写DLL所学所思(2)——导出类
  3. RabbitMQ 相关概念
  4. SSD浅层网络_目标检测SSD
  5. 异或运算交换两个整数
  6. gradle引入子module配置_原创 | 看完此文,你对Gradle的理解又升级了
  7. SIPp web frontend(2)
  8. 算法研究:插入类排序(简单插入,折半插入,希尔排序)
  9. 【HTML】使用css3和html给网站添加上春节灯笼特效
  10. xmrig 捐赠修改_四名学生如何通过CommuniGift更改在线捐赠
  11. 【kafka】Consumer is not subscribed to any topics
  12. web下拉列表代码_文章列表总结(一)
  13. sqlserver自定义函数
  14. clearinterval函数不生效_excel有没有一种技巧或函数让你相见恨晚,如果没有请看这篇文章...
  15. 数据库用户直接连接pdb
  16. 输入法编辑器(IME)编程指南
  17. 封存了一年的网络编程笔记
  18. 微软出品的Python小白神器,真香
  19. 车载以太网交换机功能和应用案例汇总, 适用于AVB/TSN, 802.1AS(gPTP时钟同步)
  20. 系统学习深度学习(四) --CNN原理,推导及实现源码分析

热门文章

  1. hbw-utils - 关于guava和jdk的compare方法
  2. C语言 将十六进制字符串转为十六进制数 (二进制、十进制都适用)
  3. 电视剧植入式广告的植入方式有哪些
  4. 这几个游戏玩不通关你还算黑客?
  5. 地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法
  6. 《写给大家看的设计书(第3版)》
  7. 一、docker 入坑(win10和Ubuntu 安装)
  8. 【亲测有效】Linux系统安装NVIDIA显卡驱动
  9. Windows 局域网间如何共享文件
  10. 【Few-Shot Segmentation论文阅读笔记】PANet: Few-Shot Image Semantic Segmentation with Prototype , ICCV, 2019