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 >>>