Python中的字符串:字符串的基本操作及再论对象是否可变
off999 2024-09-14 07:09 45 浏览 0 评论
引言
基于Python系列前面的几篇文章中,应该已经在脑海中对Python中的核心理念,有了一些认知,由于比较关键,这里再来回顾一下:
1、Python中一切皆对象
2、对象分为可变对象和不可变对象
3、区分重新赋值操作,还是对象本身发生变化
4、新手困惑的不可变对象的所谓的“对象修改”操作,一定是重新赋值操作,通过观察id()前后的变化,即可
5、看似简单的一行代码一般都不是一步完成,而所谓字节码指令是能看到Python一行代码背后的实现步骤。
今天这篇文章,我们结合Python中的字符串的探究,再来进一步加深对这些理念的认知。
字符串的基本使用
Python中关于字符串的使用,相对来说是比较方便的。
关于字符串对象的创建、常用的一些方法,这里就不进行罗列了,随处都能查到,只要你能想到要对字符串进行的操作,Python大概也会有对应的方法,可以方便实现。关于字符串提供的方法,不用记忆,用到的时候,自行尝试或者检索即可,所以不再展开。
接下来,首先基于三个字母,对Python中提供的字符串使用的3个比较便捷的场景,其次,看一下Python中支持的字符串运算
26个字母至少要学会f/r/b
字母f对应的是字符串格式化,也就是常说的f-string语法糖。
关于字符串的格式化方法,前面关于print()函数的使用时,已经有所提及,这里不再展开,只是简要说明一下。需要知道的一点是,关于字符串的格式化,能使用f-string的时候,还是尽量使用f-string,在使用的便捷程度及底层实现上,Python已然做了足够多的优化,在使用过程中,可以自行体会:
name = '张三'
gender = '女'
s1 = "姓名: %s, 性别: %s" % (name, gender)
s2 = "姓名: {}, 性别: {}".format(name, gender)
s3 = f"姓名: {name}, 性别: {gender}"
print(s1)
print(s2)
print(s3)
字母r对应的字符串禁止自动转义的操作,默认情况下,字符串中以\打头的转义字符会进行自动化转义操作。如果需要保持字符串中的转义字符,在其他语言中一般是通过双反斜线\来实现,如果有多个转义字符,就需要多个地方都要改写,比较麻烦。
Python中不需要对原始字符串的内容进行修改,只需要在字符串开头加上一个r字母即可:
s1 = "hello world\n"
s2 = r"hello world\n"
print(s1)
print(s2)
执行结果:
字母b对应了字符串的转换为二进制编码的方法,关于字符串的编码、解码,可以简单演示一下,需要用到时,再做进一步深入:
s1 = "hello Python"
s2 = b"hello Python"
print(type(s1))
print(type(s2))
s3 = s1.encode('utf-8')
print(type(s3))
print(id(s2))
print(id(s3))
print(s2 == s3)
s4 = s2.decode('utf-8')
print(s4)
print(s1 == s4)
执行结果:
字符串前加上b,实际上是得到一个bytes对象,字符串对象和bytes对象之间可以通过encode()、decode()方法进行相互转换。
Python中的字符串运算
关于Python中的字符串运算,这里也不全面罗列,只是对比其他语言中,相对不同、觉得更加方便的用法,简单描述一下:
字符串拼接
Python中关于字符串的拼接,有多种方式,最简单的就是使用加法+;
如果使用相同的分割符也可以使用join()方法;
如果比较固定,还可以使用前面提到的f-string字符串格式化的方式,简单通过代码演示一下这些用法:
name = '张三'
gender = '女'
remark = 'Python大神'
s1 = name + ':' + gender + ':' + remark
s2 = ':'.join([name, gender, remark])
s3 = f"{name}:{gender}:{remark}"
print(s1)
print(s2)
print(s3)
执行结果:
字符串分割
Python中提供字符串分割的方法,返回包含各个子串的列表对象:
s1 = '张三:女:Python大神'
res = s1.split(':')
print(res)
执行结果:
通过查看split()方法的定义,可以看到有一个默认参数maxsplit=-1,设置该参数,可以指定从左到右最多的分割子串的个数,不再演示,可以自行尝试。
字符串相乘
Python支持字符串的乘法,可以实现字符串的快速重复操作,也比较简单,模仿《天龙八部》中的桥段:
s1 = '叩首千遍,心诚则灵:'
s2 = '叩首' * 1000
s3 = '汝即叩首千遍,足见心诚,传你无上Python功法,祝你叱咤江湖'
print('\n'.join([s1, s2, s3]))
执行结果:
字符串索引和切片
Python中的字符串也是可迭代的对象,支持索引和切片操作,方法基本同列表对象的索引和切片:
s1 = "hello Python"
# 索引操作,索引从0开始
print(s1[0])
# 切片操作,切片一般是,左闭右开:[start, end)
print(s1[:5])
执行结果:
关于更多的切片方式,参考列表的切片,可以自行研究。
字符串驻留的优化实现
字符串驻留(String Interning)是一种优化技术,由于字符串对象本身是不可变的,所以,当一个相同的字符串有可能被重复使用时,可以通过把某些字符串驻留在内存中,让这些引用相同字符串的变量,指向常量内存池中的同一个字符串对象,从而节省内存并提高运行速度。
此外,在进行字符串比较时,如果字符串对象驻留在驻留池中,只需要比较字符串的引用是否相同即可,而不需要进行逐字符比较。
不同的Python虚拟机中的实现细节可能不太一样,可以先粗略地理解为虚拟机内部会申请一块内存区域,用于字符串驻留,可以称之为字符串驻留池(intern pool)。当发现代码中需要创建一个新的字符串对象时,Python解释器会首先检查字符串驻留池,如果已经存在相同的字符串,则直接返回该字符串对象的引用,而不是创建一个新的字符串。
字符串驻留的思想,跟我们所熟知的缓存技术很是相似。
相似的还有缓存区、字符串驻留池的空间是有限的,不可能所有的字符串都进行驻留优化。
Python中字符串驻留的限制没有明确说明,不过,我们可以通过代码进行推测字符串驻留的行为机制:
s1 = 'a' * 100
s2 = 'a' * 100
print(id(s1))
print(id(s2))
通过修改字符串的长度,两个字符串的id()相同,则发生了驻留;如果id()不同,则没有发生驻留。可以从100~10000,进行二分查找,考虑到二进制,可以尝试1024、2048、4096等特殊长度。在笔者的环境中,字符串长度小于等于4096时,可以触发字符串驻留机制,一旦超过这个阈值,则不再进行字符串驻留。
s1 = 'a' * 4096
s2 = 'a' * 4096
print(id(s1))
print(id(s2))
s3 = 'a' * 4097
s4 = 'a' * 4097
print(id(s3))
print(id(s4))
执行结果:
s1与s2的id()是相同的,s3与s4的id()是不同的,可以验证上述的结论。
如果一个较长的字符串,只要你有需要,也是可以手动触发字符串驻留:
x = sys.intern('a' * 5000)
y = sys.intern('a' * 5000)
print(id(x))
print(id(y))
从字节码看实现字符串的不可变
还是开篇提到的字符串对象是可变的,我们前面提到的字符串相关的操作运算,看似字符串发生了改变。其实,在底层都是创建了新的字符串对象,然后进行了重新赋值操作。
name = '张三'
gender = '女'
s1 = f"{name}:{gender}"
# print(id(name))
# print(id(gender))
# print(id(s1))
# 实际是常量池中有一个字符串对象李四
name = '李四'
# print(id(name))
可以通过输出id(),看到操作前后,已经不是同一个对象。如果查看对应的字节码,可以更加清楚:
通过查看字节码,我们可以更清晰地看到字符串对象的创建与重新赋值操作。
这篇文章就先写到这里了,感谢您的阅读。
欢迎关注,持续分享更多好玩、好用的 Python 技术!
相关推荐
- ftp手机客户端(ftp手机客户端存文件)
-
要想实现FTP文件传输,必须在相连的两端都装有支持FTP协议的软件,装在您的电脑上的叫FTP客户端软件,装在另一端服务器上的叫做FTP服务器端软件。 客户端FTP软件使用方法很简单,启动后首先要与...
- 原版xp系统镜像(原版xp系统镜像怎么设置)
-
msdnitellyou又可以上了,那里有。 制作需要的软件 在开始进行制作之前,我们首先需要下载几个软件,启动光盘制作工具:EasyBoot,UltraISO以及用来对制作好的ISO镜像进行测...
- office2007密钥 office2016(office2007ultimate密钥)
-
word2016激活密钥有两种类型:永久激活码和KMS期限激活密钥。其中,永久激活密钥可以使用批量授权版永久激活密钥进行激活,如所示;而KMS期限激活密钥需要使用KMS客户端密钥进行激活,如所示。另外...
- windows10系统启动盘制作(windows10启动盘制作教程)
-
Windows10系统更改启动磁盘的方法如下1、按快捷键Win+R,调出命令窗口2、输入msconfig,点【确定】3、在系统配置中,选择【引导】菜单4、选择要默认启动的磁盘,点【设置为默认值】,...
- 方正电脑怎么重装系统
-
购买一张系统盘,然后启动电脑,将购买的系统盘插入电脑光驱中,等待光驱读取系统盘后,点击安装系统,即可自动安装,等待安装完毕,电脑会自动重启,重新启动后,电脑的系统就安装完毕,可以使用了一、准备需要的软...
-
- qq邮箱怎么写才正确
-
步骤/方式1一般默认的QQ邮箱格式是:QQ号码@qq.com,即QQ账号+@qq.com后缀步骤/方式2若要发送邮件,也要在对方的qq帐号末尾加上@qq.com1.每个人在注册QQ时都会有关联的一个邮箱,它的格式就是“QQ号码@qq.com...
-
2025-12-21 18:51 off999
-
- 电脑怎么看配置信息
-
要查看Windows电脑的配置信息,可以通过按下Win键+R,然后在弹出的运行对话框中输入“dxdiag”并按回车键打开DirectX诊断工具,可以查看有关处理器、内存、显卡等硬件信息。另外,还可以右键点击“此电脑”,选择“属性”来查看...
-
2025-12-21 18:03 off999
- mpeg是什么格式(mpeg是什么格式和mp4的区别)
-
是视频格式,是电脑视频文件的一种,相对其它视频文件格式而言,mpeg格式占的存储空间相对比较小,那么像素也就相对比较低,图像也没有其它格式那么高清,不过一般情况下已经满足正常的使用。好多视频文件都是采...
- 电脑参数配置怎么选(电脑参数配置怎么选择)
-
1、CPU,这个主要取决于频率和二级缓存,三级缓存,核心数量。频率越高、二级缓存越大,三级缓存越大,核心越多,运行速度越快。速度越快的CPU只有三级缓存影响响应速度。2、内存,内存的存取速度取决于接口...
- windows7字体(Windows7字体库在哪)
-
win7系统默认中文字体是微软雅黑字体1、首先我们先打开个性化2、然后我们打开“窗口颜色”3、然后我们点击“项目”里的桌面,选择“已选定的项目”4、下面就可以改字体,还有字体的颜色、大小5、然后点击“...
- windows7x86是32位吗(windows7 x86)
-
X86不是代表操作系统,是代表的CPU的类型,如果你知道CPU的发展史就知道,个人用计算机的CPU很早的版本是从286、386、486、586、奔腾等等类型发展起来的,所以X86的代表PC的CPU的类...
- 固态硬盘删除后又自动恢复了
-
进入BIOS查看,第一启动项是不是UEFI引导,改掉它可以下载个pe,下载安装在本地磁盘里,重启进入pe工具,先给固态格式化分区,在ghost机械盘上的系统,还原到固态上。遇到这种情况一定不要在此...
- win10版本回退(win10回退到以前版本)
-
如果你想在Windows10系统中回退到上一个版本,可以按照以下步骤进行操作:1.打开设置:点击Windows开始按钮,然后点击屏幕左侧的“设置”图标,或者使用键盘快捷键Win+I打开设置。2...
- 营业厅一个路由器多少钱(上门更换路由器收费吗)
-
移动免费装宽带活动全国都在搞,不过免费是有“门槛”的。以我所在的地区为例,只有月费在78元及以上的大流量套餐用户,才可以享受免费安装移动的宽带。月费越高,宽带的速率也越高,148元档可以安装200M的...
- win10从u盘启动怎么设置(win10怎么从u盘启动电脑)
-
1.回到桌面。点击开始徽标,点击开始菜单左侧的设置。2.设置界面点击更新和安全。3.进入更新和安全界面,点击左侧的恢复选项。4.进入恢复界面,点击高级启动下面的立即重新启动。5.插入自己的U盘,等待...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
