博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3. Python3源码—整数对象
阅读量:6611 次
发布时间:2019-06-24

本文共 1452 字,大约阅读时间需要 4 分钟。

3.1. 整数对象

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

3.1.1. Python中的创建

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

图片描述

3.1.2. PyLong_FromLong的C调用栈

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

图片描述

3.1.3. PyLong_FromLong源码

图片描述

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

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

图片描述

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

3.1.5. 小整数和大整数

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

  • 小整数:

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

图片描述

small_ints在_PyLong_Init中被初始化:

图片描述

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

图片描述

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

图片描述

  • 大整数:[1073741824, +∞)

图片描述

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方法:

图片描述

  • PyObject_INIT_VAR,初始化变长变量:

图片描述

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,只是一个强转:

图片描述

3.2. 整数对象的特性

3.2.1. 数值计算

图片描述

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

图片描述

3.2.2. to string

图片描述

3.2.3. hash

图片描述

3.2.4. 比较

图片描述

3.2.5. 内置方法

图片描述

3.2.6. 内置属性

图片描述

3.3 参考

  • Python源码剖析

本文作者:whj0709

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

你可能感兴趣的文章
【log4j】使用Log4j?,slf4j更轻巧高效
查看>>
kuangbin专题七 POJ3264 Balanced Lineup (线段树最大最小)
查看>>
JS动画效果链接汇总
查看>>
父类转为子类涉及到的安全问题
查看>>
网络流,流水线模拟
查看>>
知识点笔记
查看>>
陈云川的OPENLDAP系列
查看>>
django 模型-----自连接
查看>>
P1197 [JSOI2008]星球大战
查看>>
urllib模块
查看>>
XML转义字符
查看>>
微信小程序之简单记账本开发记录(六)
查看>>
死锁和活锁
查看>>
JavaScript的简单继承实现案例
查看>>
<Linux命令行学习 第一节> CentOS在虚拟机的安装
查看>>
mysql设置字符集CHARACTER SET
查看>>
Perl完全自学手册图文教程
查看>>
python(5)字典
查看>>
用createrepo配置Yum本地源
查看>>
wordpress拿WebShell
查看>>