D.5 字符串

Python 3.x 中一个特别明显的改变就是默认字符串类型正在变化。Python 2.x 同时支持ASCII和Unicode字符串,默认情况下是ASCII编码。而Python 3中这种支持刚好调换:Unicode现在变成了默认类型,而ASCII字符串现在称为bytes。bytes数据结构包含字节值,并且它不应该再被视为一个字符串,因为它是一个包含数据的不可变字节数组。

目前在Python 3.x中,字符串字面量将需要一个前导b或B,并且目前的Unicode字符串字面量将废弃它们的前导u或U。类型和内置函数名字将会分别从str变成bytes和从unicode变成 str。此外,还有一个名为 bytearray(字节数组)的新可变“字符串”类型,就像 bytes一样,它也是一个字节数组,只是它可变。

可以在HOWTO系列文章中找到关于使用Unicode字符串的更多信息,并在PEP 3137中了解字符串类型的这些变化。请参考表C-1来了解Python 2和Python 3中各种字符串类型。

D.5.1 bytes字面量

为了在Python 3.x中平滑使用bytes对象的方式,在Python 2.6中可以选择为一个普通的ASCII或二进制字符串添加一个前导b或B,从而创建字节字符(b"或B")作为 str字面量的同义词(")。前导指示器本身与任何str对象或任何对象操作符(纯粹只是装饰)都没有关系,但是它确实为你准备了Python 3中的情景,此时你需要创建这样的字面量。可以在PEP 3112中找到关于bytes字面量的更多信息。

Bytes就是str

应该不需要太多的想像力来识别,如果支持bytes字面量,那么bytes对象本身需要存在于Python 2.6+中。事实上,bytes类型是str的代名词,如下所示。

>>> bytes is str

True

因此,在Python 2.6+中任何需要使用str或str()的地方,都可以使用bytes或bytes()来代替。可以在PEP 358中找到有关bytes对象的进一步信息。