字符串——不变性

未匹配的标注

还要注意到在前面的例子中对原始字符串进行的操作并没有改变它。每个字符串操作都被定义为产生一个新字符串作为结果,因为在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文本来完全理解这段代码。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~