PyBytesObject
本文参考的是 3.8.0a0 版本的代码,详见 cpython 源码分析 基本篇
以后都在 github 更新,请参考 图解python bytes
我们都知道在 python 中有以下两个对象可以表示 字节(bytes)
a = bytes(b"\x1cccc")
print(a) # b'\x1cccc'
b = bytearray(b"\x1cccc")
print(b) # bytearray(b'\x1cccc')
a[0] = 97 # TypeError: 'bytes' object does not support item assignment
b[0] = 97 # no problem
print(b) # bytearray(b'accc')
一个是 bytearray, 一个是 bytes. 从上面的代码里面可以发现,bytearray 是支持 [] 操作的,你可以更改任意的一个位置的值,在另一篇里也介绍过,就不多说了
而另一个是 bytes, bytes 和 tuple 一样都是 immutable 的对象,你不能像 bytearray 一样更改里面的值,bytes 里面每个位置存的都是 0 - 255 之间的数值,也就是 1个 byte 能表示的范围
那么我们来看下 PyBytesObject 的定义
由上图可知,PyBytesObject 主要由以下的几个部分构成
PyObject_VAR_HEAD: python 可变对象的公共表示部分
ob_shash: 这个 bytes 对象里面存储的字节数组的哈希值,存储这个值可以避免每次需要的时候都去重新计算,提高效
ob_sval: 存储Bytes 里的字节的真实的位置,并且最后位置为 0,有点像 c 里面的 null terminated string
_PyBytesWriter
bytes 本质上就是一个字节数组,在 byteobject.c 和 bytesobject.h 中并未看到比较特殊的地方
但是在 bytesobject.h 中找到了一个对象叫 _PyBytesWriter
/*
Include/bytesobject.h
144 - 165 行
*/
typedef struct {