Bytes 对象是由单个字节做为基本元素(8位,取值范围 0-255)组成的序列,为不可变对象。函数
Bytes 对象只负责以二进制字节序列的形式记录所需记录的对象,至于该对象到底表示什么(好比究竟是什么字符)则由相应的编码格式解码所决定。咱们能够经过调用 bytes() 类(没错,它是类,不是函数)生成 bytes 实例,其值形式为 b'xxxxx',其中 'xxxxx' 为一至多个转义的十六进制字符串(单个 x 的形式为:\xHH,其中 \x 为小写的十六进制转义字符,HH 为二位十六进制数)组成的序列,每一个十六进制数表明一个字节(八位二进制数,取值范围 0-255),对于同一个字符串若是采用不一样的编码方式生成 bytes 对象,就会造成不一样的值:编码
好比上例中的 a 字符串对象,其十进制 unicode 值为 24464,分别使用 'utf-8' 和 'gb2312' 两种编码格式将其转换成 bytes 对象 b 和 c ,结果 b 和 c 的值是彻底不一样的,因为基于的编码格式不一致, b c 长度甚至都不相同,前者有 3 个字节长度,后者有 2 个字节长度:spa
另外,对于 ASCII 字符串,能够直接使用 b'xxxx' 赋值建立 bytes 实例,但对于非 ASCII 编码的字符则不能经过这种方式建立 bytes 实例:code
因为 bytes 是序列,所以咱们能够经过索引或切片访问它的元素:对象
能够发现若是以单个索引的形式访问元素,其会直接返回单个字节的十进制整数,而以序列片断的形式访问时,则返回相应的十六进制字符序列。索引
对于 bytes 实例,若是须要还原成相应的字符串,则须要借助内置的解码函数 decode(),借助相应的编码格式解码为正常字符串对象,若是采用错误的编码格式解码,则有可能发生错误:ip