字符串——不变性 | 第二部分 类型与操作 —— 第 4 章: 介绍 python 对象类型 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-江南app体育官方入口
还要注意到在前面的例子中对原始字符串进行的操作并没有改变它。每个字符串操作都被定义为产生一个新字符串作为结果,因为在python中字符串是不变的——它们在被创建后不能直接被改变。换句话说,永远无法覆盖不可变对象的值。比如,不能通过对字符串的一个位置赋值来改变它,但总可构建一个新字符串,然后将它赋值给同一变量名。因为随着操作,python会清理掉旧的对象(随后将看到),这并不像它听起来那么低效:
>>> s
'spam'
>>> s[0] = 'z' # 不能改变不可变对象
...省略的错误文字...
typeerror: 'str' object does not support item assignment
>>> s = 'z' s[1:] # 但可以运行表达式来创建新对象
>>> s
'zpam'
在python中的每个对象都被分为不可变的或可变的。就核心类型而言,数字,字符串和元组是不可变的;列表,字典,和集合则是可变的——它们可以自由直接地被改变,就像将用类来编码的大多数新对象那样。这个区别被证明在python工作中是至关重要的,但现在还无法完全探索。另外,不可变性可被用来确保对象在整个程序中保持恒定;可变对象的值能在任何时间地点被改变(且不管是否期待与否)。
严格来说,如果将基于文本的数据扩展到单独字符的列表并用“空”分隔符来将它连接回去,或使用在python2.6,3.0和之后版本中可用的更新的 bytearray
类型,都可以直接改变它:
>>> s = 'shrubbery'
>>> l = list(s) # 扩展到列表: [...]
>>> l
['s', 'h', 'r', 'u', 'b', 'b', 'e', 'r', 'y']
>>> l[1] = 'c' # 直接改变它
>>> ''.join(l) # 用“空”分隔符来连接
'scrubbery'
>>> b = bytearray(b'spam') # 字节/列表混合体(在前面)
>>> b.extend(b'eggs') # 'b' 在 3.x 需要, 但在 2.x 不需要
>>> b # b[i] = ord(c) 在这里也可以使用(这句一般用在循环中,i, c是循环变量)
bytearray(b'spameggs')
>>> b.decode() # 翻译成普通字符串
'spameggs'
bytearray
支持对文本的直接修改,但只适合那些其中的字符最多是8位宽的文本(比如,ascii)。所有其他的字符串仍然是不可变的——bytearray是一个不变字节字符串(它的 b'...' 语法在3.x中必需,在2.x中可选)和可变列表(在[]中编码和显示)的独特混合体。必须学习更多关于这些(bytearray,字节字符串和列表)和unicode文本来完全理解这段代码。