python3源码百度云_3. Python3源码—整数对象

3.1. 整数对象

整数对象是“变长对象”。

3.1.1. Python中的创建

Python中整数对象最重要的创建方法为PyLong_FromLong,如下Python语句最终会调用到PyLong_FromLong:

8c0700d4bfcfadd40ab9008b4683864f.png

3.1.2. PyLong_FromLong的C调用栈

词法解析,最终调到PyLong_FromLong,调用顺序如下:

524b190831dba47c21e30b4d1b3d98eb.png

3.1.3. PyLong_FromLong源码

0bea6b40139163439c75d91450c240e7.png

3.1.4. 整数对象的C数据结构

此处使用了C语言的技巧:把单一元素的数组放在一个struct的尾端,每个struct objects可以拥有可变大小的数组(深度探索C++对象模型 P19)。

b43cef0ccc13255427717a9bbc931e2a.png

从数据结构也可以看出Python中的整数对象是“变长对象”。

3.1.5. 小整数和大整数

从上述源码中可以看到,整数分为小整数、介于小整数和大整数之间的整数和大整数三类,处理不尽相同。对于负数,转成正数,并记录符号。

小整数:

CHECK_SMALL_INT用于处理小整数,[-5, 257)在Python中被视为小整数。

e50e30c46381ff225d0da72dac287be5.png

small_ints在_PyLong_Init中被初始化:

3b454d3711b8acb41741a965b9656a9f.png

如果在[-5, 257)范围内,会直接返回存于small_ints的对象,所以小整数只会存在一个实例:

b3b3448d500326d607ad793221f9a83c.png

介于小整数和大整数之间的整数:[257, 1073741824)

04ce9828bc42e00f7649868d53b11ee8.png

大整数:[1073741824, +∞)

9fa2ac09c5a4fabf871cbdd5d5be4efb.png

Python的整数不再有限制。

The sys.maxint constant was removed, since there is no longer a limit to the value of integers. However, sys.maxsize can be used as an integer larger than any practical list or string index. It conforms to the implementation’s “natural” integer size and is typically the same as sys.maxint in previous releases on the same platform (assuming the same build options).

3.1.6. PyLong_FromLong中其它需要关注的

_PyLong_New,此方法需要注意内存分配计算方式,以及最后初始化变长变量调用了PyObject_INIT_VAR方法:

96beeeeec89b11ec6a63b0fef5eb85f2.png

PyObject_INIT_VAR,初始化变长变量:

d1f400d30205901b8c3b41dde99e7cb0.png

release版本下_Py_INC_TPALLOCS、_Py_COUNT_ALLOCS_COMMA、_Py_INC_REFTOTAL、_Py_REF_DEBUG_COMMA都没有定义,所以PyObject_INIT_VAR其实就是将PyVarObject对象的ob_size、ob_type和ob_refcnt进行了赋值。

Py_SAFE_DOWNCAST,只是一个强转:

b009e89d1bbe74282fda21399e2c87dc.png

3.2. 整数对象的特性

3.2.1. 数值计算

28a85c2de8245abf3cb467610060d005.png

整数对象的数值计算由long_as_number定义:

ba2a965e10bb6478623907a6a6458857.png

3.2.2. to string

899d5e4f77fa8b7e417fd28dcde453ab.png

3.2.3. hash

ccb9bbe00e797df81528490e834bf6e1.png

3.2.4. 比较

7426959fe9b7a6fb822877777b6488e8.png

3.2.5. 内置方法

6cee70b0d93b276430280928865e8ab5.png

3.2.6. 内置属性

db25c8b74ebc84e42676c8eb5e0fe5c3.png

3.3 参考

本文作者:whj0709

阅读原文

本文为云栖社区原创内容,未经允许不得转载。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值