python bytes对象 底层实现 源码分析 PyBytesObject(bytes)

本文探讨了Python 3.8.0a0版本中bytes对象的实现,重点分析了PyBytesObject的结构,包括PyObject_VAR_HEAD、ob_shash和ob_sval等组成部分。同时提到了_PyBytesWriter在字符串格式化过程中的作用,它用于存储格式化后的数据。
摘要由CSDN通过智能技术生成

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 {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值