Python字符串的创建和驻留机制详解

字符串

字符串是python中最常用的数据类型,一般用单引号或者双引号来创建字符串(必须成对)。字符串是不可变序列

a = 'hello'
b = "python"
print(type(a))   #<class 'str'>
print(type(b))   #<class 'str'>

1、字符串里面输出单引号或者双引号:

使用转义字符或者使用不同的引号把字符串包围起来。

#第一个单引号和第二个单引号匹配成对了,第三个单引号成单身的了,m Tom'成了多余的内容,就会报错了
s = 'I'm Tom'   #SyntaxError: unterminated string literal (detected at line 20)

#使用不同的引号
s = "I'm Tom"
print(s)

#使用转义字符
s1 = 'I\'m Tom'
print(s1)

2、字符串的换行,在行尾添加\

字符串比较长,在要换行的地方添加转义字符进行换行,表达式也可以换行,这样子做的字符串输出时,是不换行的:

s = 'One day,a monkey drove \
his car near a lake.Sudden,\
he saw a tiger under a 。'
print(s)  #One day,a monkey drove his car near a lake.Sudden,he saw a tiger under a 。

a = 10+3/2+\
       2**3
print(a)      #19.5

3、长字符串(多行字符串),用三对单引号或者三对双引号(字符串内容原样输出,支持换行):

不需要在换行的地方加\。字符串里面的换行,空格,缩进,以及单引号和双引号等都会原样输出。

若是不把长字符串的值赋给任何变量,那就相当于被注释了,不起任何作用。

s1 = '''java'''
print(type(s1))     #<class 'str'>

str2 = """hello
python
java
"""
print(str2)  #字符串原样输出,换行符也输出
print(type(str2))   #<class 'str'>

str3 = 'hello' \
       'word'
print(str3)  #只是代码换行了。不加换行符就输出

4、原始字符串

python中比较特殊的字符串,以R或者r开始。在原始字符串中,反斜杠”\”不表示转义字符,字符串中的内容原样输出。具体的在‘Python中的原始字符串’一文中有详细介绍。

注意:python没有字符类型,单个字符就是长度为1的字符串

驻留机制

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

比喻说

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

a,b,c三个变量的值相同,类型和标识也都相同。

图片[1]-Python字符串的创建和驻留机制详解-尤尤'blog

1、驻留机制的几种情况(交互模式)

打开交互模式:win+R打开运行窗口,输入cmd,再输入python

  • 字符串的长度为0或者1
Python 3.10.7 (tags/v3.10.7:6cc6b13, Sep  5 2022, 14:08:36) [MSC v.1933 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s1 = ''
>>> s2 = ''
>>> s1 is s2
True
>>> s3 = 'a'
>>> s4 = 'a'
>>> s3 is s4
True
>>>

is是身份运算符,比较的是id。==比较的是value值。

  • 符合标识符的字符串
Python 3.10.7 (tags/v3.10.7:6cc6b13, Sep  5 2022, 14:08:36) [MSC v.1933 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> str1 = 'ab_12'   #符合标识符
>>> str2 = 'ab_12'
>>> str1 == str2
True
>>> str1 is str2
True
>>> str3 = 'x*y'    #不符合标识符
>>> str4 = 'x*y'
>>> str3 == str4
True
>>> str3 is str4
False
>>> id(str3)
1750506482800
>>> id(str4)
1750506482928
>>>

标识符只包含数字字母和下划线。

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

python是一种解释型语言。解释器将.py中的代码编译成.pyc文件(字节码)。

>>> s1 = 'abc'
>>> s2 = 'ab'+'c'   #字符串拼接
>>> s3 = ''.join(['ab','c'])    #字符串拼接
>>> s1 is s2
True
>>> s1 is s3
False
>>> s1,s2,s3
('abc', 'abc', 'abc')
>>> type(s1),type(s2),type(s3)
(<class 'str'>, <class 'str'>, <class 'str'>)
>>>

s2 = ‘ab’+’c’ 是在运行前就连接完成了。

s3 = ”.join([‘ab’,’c’]) 是在程序运行的时候,通过join()方法对列表中的数据进行拼接的。在程序运行的时候,会开辟新的内存空间,所以没有产生驻留。

  • [-5,256]之间的整数数字
>>> a = -5
>>> b = -5
>>> a is b
True
>>> a = -6
>>> b = -6
>>> a is b
False
>>> 

通过sys模块的intern()方法可以进行强制驻留:

>>> import sys
>>> a = 'x*y'
>>> b = 'x*y'
>>> a is b
False
>>> a = sys.intern(b)   #强制驻留,强行将两个字符串指向同一个对象
>>> a is b
True
>>>

pycharm对字符串进行了优化处理。

s1 = 'x*y'
s2 = 'x*y'
print(s1 is s2)     #True

内容相同的,pycharm就强制处理,进行驻留。

2、驻留机制的优缺点

在我们需要值相同的字符串时,就可以直接从字符串池中拿出来使用,避免了频繁的创建和销毁(因为python中一切皆对象,创建和销毁对象都是需要时间的),从而提升效率和节约内存。因此拼接和修改字符串会影响性能(拼接和修改字符串都会产生新的字符串对象)。

所以在字符串拼接的时候建议使用join()方法,而不是’+’。因为join()是先计算出所有字符串的长度,然后再拷贝,它只创建一次对象,效率比’+’要高。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容