python整型数据源码分析_大师兄的Python源码学习笔记(三): 整数对象

一、关于整数对象

整数对象是Python中最简单的对象。

Python2中包含PyIntObject和PyLongObject两种类型。

而Python3取消了PyIntObject,仅保留PyLongObject。

以下是代码的头两行,可以感受作者在修改过程中的艰辛:

/* Long (arbitrary precision) integer object implementation */

/* XXX The functional organization of this file is terrible */

1.1 PyLongObject

除了定长对象和变长对象,根据对象维护数据的可变性,可将对象分为可变对象(mutable)和不可变对象(immutable)。

PyLongObject就是一个不可变对象。

Include/longobject.h

/* Long (arbitrary precision) integer object interface */

typedef struct _longobject PyLongObject; /* Revealed in longintrepr.h */

Include/longintrepr.h

/* Long integer representation.

The absolute value of a number is equal to

SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)

Negative numbers are represented with ob_size < 0;

zero is represented by ob_size == 0.

In a normalized number, ob_digit[abs(ob_size)-1] (the most significant

digit) is never zero. Also, in all cases, for all valid i,

0 <= ob_digit[i] <= MASK.

The allocation function takes care of allocating extra memory

so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available.

CAUTION: Generic code manipulating subtypes of PyVarObject has to

aware that ints abuse ob_size's sign bit.

*/

struct _longobject {

PyObject_VAR_HEAD

digit ob_digit[1];

};

Python中的整数对象实际上是对C中原生类型long的简单包装。

Objects/longobject.c

PyTypeObject PyLong_Type = {

PyVarObject_HEAD_INIT(&PyType_Type, 0)

"int", /* tp_name */

offsetof(PyLongObject, ob_digit), /* tp_basicsize */

sizeof(digit), /* tp_itemsize */

long_dealloc, /* tp_dealloc */

0, /* tp_print */

0, /* tp_getattr */

0, /* tp_setattr */

0, /* tp_reserved */

long_to_decimal_string, /* tp_repr */

&long_as_number, /* tp_as_number */

0, /* tp_as_sequence */

0, /* tp_as_mapping */

(hashfunc)long_hash, /* tp_hash */

0, /* tp_call */

long_to_decimal_string, /* tp_str */

PyObject_GenericGetAttr, /* tp_getattro */

0, /* tp_setattro */

0, /* tp_as_buffer */

Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |

Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */

long_doc, /* tp_doc */

0, /* tp_traverse */

0, /* tp_clear */

long_richcompare, /* tp_richcompare */

0, /* tp_weaklistoffset */

0, /* tp_iter */

0, /* tp_iternext */

long_methods, /* tp_methods */

0, /* tp_members */

long_getset, /* tp_getset */

0, /* tp_base */

0, /* tp_dict */

0, /* tp_descr_get */

0, /* tp_descr_set */

0, /* tp_dictoffset */

0, /* tp_init */

0, /* tp_alloc */

long_new, /* tp_new */

PyObject_Del, /* tp_free */

};

PyLong_Type保存了PyLongObject相关的丰富元信息,其中:

long_dealloc # PyLongObject对象的析构操作

PyObject_Del # 释放操作

long_to_decimal_string # 转换为PyStringObject对象

(hashfunc)long_hash # 获得哈希值

long_richcompare # 比较操作

&long_as_number # 数值操作集合

long_methods # 成员函数集合

long_new # 创建整数对象

以整数比大小为例,可以看出实际上就是将C中的long值进行比较:

static int

long_compare(PyLongObject *a, PyLongObject *b)

{

Py_ssize_t sign;

if (Py_SIZE(a) != Py_SIZE(b)) {

sign = Py_SIZE(a) - Py_SIZE(b);

}

else {

Py_ssize_t i = Py_ABS(Py_SIZE(a));

while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])

;

if (i < 0)

sign = 0;

else {

sign = (sdigit)a->ob_digit[i] - (sdigit)b->ob_digit[i];

if (Py_SIZE(a) < 0)

sign = -sign;

}

}

return sign < 0 ? -1 : sign > 0 ? 1 : 0;

}

static PyObject *

long_richcompare(PyObject *self, PyObject *other, int op)

{

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值