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
>>>
经验分享 程序员 微信小程序 职场和发展