字符实战——修改字符串1 | 第二部分 类型与操作 —— 第 7 章: 字符串基础 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-380玩彩网官网入口
还记得术语“不可变序列”吗?已知:不可变意味着不能就地更改字符串——比如,对索引赋值:
>>> s = 'spam'
>>> s[0] = 'x' # 产生一个错误!
typeerror: 'str' object does not support item assignment
那么,如何修改python中的文本信息呢?要修改字符串,通常需要使用像连接和切片这样的工具来构建和分配一个新的字符串,然后,如果想要的话,将结果赋值回字符串原来的名称:
>>> s = s 'spam!' # 要改变字符串,就得创建一个新字符串
>>> s
'spamspam!'
>>> s = s[:4] 'burger' s[−1]
>>> s
'spamburger!'
第一个例子在s的末尾通过连接添加了一个子字符串。其实,它创建了一个新字符串,然后将其分配回s,但可以将这个行为想为“改变”原来的字符串。第二个例子通过切片、索引和连接,使用6个字符替换了4个字符。下一节将看到:可以用字符串方法调用如replace
来达到类似的效果:
>>> s = 'splot'
>>> s = s.replace('pl', 'pamal')
>>> s
'spamalot'
就像产生新字符串值的每个操作,字符串方法产生新的字符串对象。如果想保留那些对象,可以将它们分配给变量名。为每个字符串改变产生新字符串对象并不像它听起来那么低效——记住,如前一章中讨论过:python自动在你工作时对老的未使用的字符串对象自动进行垃圾回收(收回空间),所以新对象重用了被之前值占据的空间。python通常比你期待的更高效。
最后,使用字符串格式化表达式来构建新文本值是可能的。下面两个都将对象替换进入字符串,在某种意义上,将对象转换为字符串,然后根据格式规定改变原来的字符串:
>>> 'that is %d %s bird!' % (1, 'dead') # 格式化表达式:所有版本均适用
that is 1 dead bird!
>>> 'that is {0} {1} bird!'.format(1, 'dead') # 在 2.6, 2.7, 3.x 中的格式化方法
'that is 1 dead bird!'
然而,尽管有这个替换暗喻,格式化的结果仍是新字符串对象,而非一个修改后的对象。本章稍后将学习格式化;将发现:格式化会比这个例子所暗示的更普适和更有用。然而,因为之前调用中的第二个是作为一个方法提供的,在进一步探索格式化之前,让我们先掌握字符串方法调用。
注意:
在第4章中已预览过,且在第37章中将被讨论,python 3.0 和 2.6 引入了新的名为bytearray
的字符串类型,它是可变的,因此可以被就地修改。bytearray
对象并不是真的文本字符串;它们是小的,8比特整数的序列。然而,它们和普通字符串一样支持大多数同样的操作,且在显示时打印为ascii字符。相应地,它们为必须被频繁修改的大量简单8比特文本提供另一个选项(更丰富的unicode文本的类型暗示不同的技术)。在第37章还将看到ord
和chr
也处理unicode字符,它们可能并不存储在单个字节中。