字符串驻留机制

一:什么叫字符串驻留机制

         仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量。

  

a='python'
b="python"
c='''python'''
print(a,id(a))
print(b,id(b))
print(c,id(c))



#运行结果如下
'''
C:\Users\k&k\PycharmProjects\pythonProject\venv\Scripts\python.exe C:/Users/k&k/PycharmProjects/pythonProject/venv/demo2.py
python 31583424
python 31583424
python 31583424

Process finished with exit code 0
'''

         a,b,c的id值相同 表示a,b,c均指向同一内存地址 

        当先将'python'赋给变量a时,a就存储了'python'对象的内存地址,a就指向了存储'python'的内存空间

        再将"python"赋给变量b时,它会发现内存中有'python'字符串,它就不会重新创建‘python’字符串了,b就会直接存储'python'的内存地址,同时b也指向了存储'python'的内存空间,c也同b一样。

二:字符串驻留机制的几种情况(交互模式)‘’

  1:字符串长度为0或1时

  2:符合标识符的字符串

  3:字符串只在编译时进行驻留,而非运行时

  4:[-5,256]之间的整数数字

#1:字符串长度为0时
>>> a=''
>>> b=''
>>> a is b
True
#  字符串长度为1时
>>> a='%'
>>> b='%'
>>> a is b
True
#2:符合标准字符串 
>>> a='abx'
>>> b='abx'
>>> a is b
True
# 不符合标准字符串
>>> a='abc%'
>>> b='abc%'
>>> a is b
False
#3:字符串编译时驻留而非运行时
>>> a='abc'
>>> b='ab'+'c'              #在运行前连接完毕
>>> c=''.join(['ab','c'])   #在程序运行时调用join()方法对列表中数据进行连接,在运行时开辟了新空间来存储’abc‘的值,所以id值改变
>>> a is b
True
>>> a is c
False
#4:[-5,256]之间的整数数字
>>> a=-5
>>> b=-5
>>> a is b
True
# 不属于[-5,256]之间的数字
>>> a=-6
>>> b=-6
>>> a is b
False

三:可以用sys中的intern方法强制2个字符串指向同一对象

>>> import sys    #导入sys模块
>>> a='abc%'
>>> b='abc%'      #a,b 不是合法的标识符
>>> a is b        #is 是a,b对象id值的比较
False
>>> a=sys.intern (b)   #使用sys中的intern()方法使a,b指向同一内存地址
>>> a is b
True

四:为什么不能在Pycharm中进行,而在交互模式下运行-------Pycharm对字符串进行了优化处理

​s1='abc%'
s2='abc%'      #s1和s2不是合法标识符
print(s1 is s2)  
    

#运行结果如下
'''
C:\Users\k&k\PycharmProjects\pythonProject\venv\Scripts\python.exeC:/Users/k&k/PycharmProjects/pythonProject/demo1.py
True    #pycharm运行环境进行了强制处理

Process finished with exit code 0

'''​

五:字符串驻留机制的优缺点

         当需要值相同的字符串时,可以直接从字符串池里拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是会比较影响性能的。

         当需要进行字符串拼接时建议使用str类型的join方法,而非”+” , 因为join方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率比”+”效率高。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZSup{A}

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值