一:什么叫字符串驻留机制
仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,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一次对象,效率比”+”效率高。