从源码理解PyVarObject与PyObject的区别

1. 引入

我们知道PyObject是python中所有对象的基类,但从源码中还可以看到另一个对象的定义PyVarObject,那PyVarObject又是什么呢?PyVarObject和PyObject有什么区别呢?

2. PyVarObject的源码

从参考2中,我们可以看到 PyObject 与 PyVarObject 的源码如下:

// _PyObject_HEAD_EXTRA 是双向链表的前驱、后继指针定义
#define _PyObject_HEAD_EXTRA            \
    struct _object *_ob_next;           \
    struct _object *_ob_prev;

typedef struct _object {
    _PyObject_HEAD_EXTRA//链表前驱、后继指针
    Py_ssize_t ob_refcnt;//引用计数
    PyTypeObject *ob_type;//类型指针
} PyObject;

typedef struct {
    PyObject ob_base;//PyObject对象
    Py_ssize_t ob_size;//对象的size
} PyVarObject;

从中可以看到,PyVarObject只是在PyObject的基础上,增加了一个ob_size,也就是对象的size。

3. 定长对象与变长对象

从参考1中,python中的对象分为两种:定长对象与变长对象。

定长对象,是不同对象占用的内存大小一样的对象,比如 int。

变长对象,则不同对象占用的内存大小可能不一样,比如string,list和dict。不同字符串的长度可能都不一样,这就是变长对象。

参考1中给出了如下图片,非常便于理解这两个概念:

在这里插入图片描述

4. 结论

定长对象(比如int),是基于PyObject来定义的;而变长对象(比如string),是基于PyVarObject来实现的。

5. 参考

  1. 陈儒,python源码解析
  2. PyObject源码,https://github.com/python/cpython/blob/3.10/Include/object.h#L105
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值