我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python3 整数类型PyLongOb

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python3 整数类型PyLongOb

python3 整数类型PyLongObject 和PyObject源码分析
一 测试环境介绍和准备
测试环境:
操作系统:windows10
Python版本:3.7.0 下载地址
VS版本:vs2015社区版(免费) 下载地址
win10SDK(安装vs2015是可以选择,如果没有安装则需要独立安装)
http://ffmpeg.club/python
二 如何查看源码
1 下载python源码
https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
http://www.ffmpeg.club/python
下载后解压缩
使用vs2015或者vs2017打开
Python-3.7.0\PCbuild\pcbuild.sln 解决方案文件
python3 整数类型PyLongObject 和PyObject源码分析
打开pythoncore项目可以找到\include\object.h文件

三 源码分析
python源码版本 python3.7.0
在python中所有的类型都可以转为PyObject类型,单python用的是c语言,并没有继承机制,我们可以通过源码看它试如何实现的,我们先看PyObject源码
1 PyObject 源码
typedef struct _object {
_PyObject_HEAD_EXTRA
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
} PyObject;

python3 整数类型PyLongObject 和PyObject源码分析
1-1 _PyObject_HEAD_EXTRA 源码
我们先看第一个成员是一个宏 _PyObject_HEAD_EXTRA,这个宏是如下定义
#ifdef Py_TRACE_REFS
/ Define pointers to support a doubly-linked list of all live heap objects. /
#define _PyObject_HEAD_EXTRA \
struct _object _ob_next; \
struct _object
_ob_prev;

#define _PyObject_EXTRA_INIT 0, 0,

#else
#define _PyObject_HEAD_EXTRA
#define _PyObject_EXTRA_INIT
#endif
python3 整数类型PyLongObject 和PyObject源码分析

通过代码我们可以看出,它根据环境给_PyObject_HEAD_EXTRA设置的值有可能是空的,或者是一个双向链表。通过编译代码我们知道,他在debug版本的python中是用的双向链表,而在release版本中是空。
1-2 Py_ssize_t ob_refcnt 引用计数
Py_ssize_t 类型在32位程序中就是int,在64位win程序中是__int64
引用计数的策略后面我们专门写文章分析
1-3 struct _typeobject ob_type;
python3 整数类型PyLongObject 和PyObject源码分析
源码比较长,就不全部列出来,这个结构体中包含了一个PyObject对象的所有相关操作函数和属性,比如对象创建和销毁函数,print对象的序列化函数等,存储方式都是通过函数指针。所以每种python类型都会对各类操作函数指针做赋值设定。
其中的PyObject_VAR_HEAD宏内容如下
typedef struct {
PyObject ob_base;
Py_ssize_t ob_size; /
Number of items in variable part */
} PyVarObject;
python3 整数类型PyLongObject 和PyObject源码分析

2 PyLongObject 整数对象

digit
struct _longobject {
PyObject_VAR_HEAD
digit ob_digit[1];
};
python3 整数类型PyLongObject 和PyObject源码分析

2-1 小数预处理
对于比较小的数(-5到257 )直接返回初始化好的值,所以说大量的小整数时,不会新增额外的空间
do if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { \
return get_small_int((sdigit)ival); \
} while(0)

python3 整数类型PyLongObject 和PyObject源码分析
2-2 按照数字的发小分配空间,以unsigned short为单位
数字少于16位也就是2个字节的,用一个digit (unsigned short) 存放
python3 整数类型PyLongObject 和PyObject源码分析
数字少于32位也就是4个字节的,用两个个digit (unsigned short) 存放
python3 整数类型PyLongObject 和PyObject源码分析
2-3 大数处理
如果是超大数,就用多个字节存放,由于变量就是一个 unsigned long,先看一下源码:
python3 整数类型PyLongObject 和PyObject源码分析
对于不同的系统,大数能表示的范围不一致,因为数字采用的是unsigned long存放,在不同的系统大小不一致,可以见如下表
python3 整数类型PyLongObject 和PyObject源码分析

其中 windows 64位使用的是 LLP64所以 在window中python数字的最大值也就是4个字节,如果用它来存放64位指针的地址,就会丢失数据。
在linux(ubuntu16.04 64)使用的是LP64,,所以数字最大值就是8个字节。
相关视频可以观看
python3 整数类型PyLongObject 和PyObject源码分析
http://edu.51cto.com/course/15278.html

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python3 整数类型PyLongOb

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python3 整数类型PyLongOb

python3 整数类型PyLongObject 和PyObject源码分析一 测试环境介绍和准备测试环境:操作系统:windows10Python版本:3.7.0 下载地址VS版本:vs2015社区版(免费) 下载地址win10SDK(
2023-01-31

【Python3】基本数据类型-整型(

整型(int)在32位机器上,整数的位数为32位,取值范围为-231~231-1,即-2147483648~2147483647在64位系统上,整数的位数为64位,取值范围为-263~263-1,即-9223372036854775808~
2023-01-31

python3-数据类型

1.空值空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值2.在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变
2023-01-31

2.Python3 数据类型

一、数据类型初识 1、数字2 是一个整数的例子。长整数 不过是大一些的整数。3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里,52.3E-4表示52.3 * 10-4。(-5+4j)和(2.3-4.6j)是复数的例子,其中
2023-01-31

Python3 数据类型-Number

说明数据类型是不允许改变的,这就意味着如果改变数字数据类型得值,将重新分配内存空间。以下实例在变量赋值时 Number 对象将被创建:var1 = 1var2 = 10使用del语句删除一些数字对象的引用,del语句的语法是:del var
2023-01-31

Python3的数据类型

Python提供了强大的内置数据类型,以供程序员使用。除非有特殊原因,我们最好总是使用内置类型作为我们的实现方案。内置的数据对象更快更高效,并且经过了大量的验证,不容易出错。      下面就是Python的内置的数据类型:数据类型实例数字
2023-01-30

Python数据类型 -数值类型(整数,

一、整数:1)整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点。Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型。如:num01 =100
2023-01-31

python3--基础数据类型

python基础二(基础数据类型)1.什么是数据? x=10,10是我们要存储的数据2.为何数据要分不同的类型 数据是用来表达状态的,不同的状态就应该用不同的类型数据去表示3.数据类型数字,字符串,列表,元组,字典,集合数字int数字主要是
2023-01-30

Python3基本数据类型

Python3的基本数据类型变量不需要提前声明每个变量使用前必须赋值,赋值之后能会被建立Python中,变量是没有类型的,这里所说的“类型”是指内存中所存储的对像的类型。Python中有六种标准数据类型Number (数字)String (
2023-01-31

Python3基础数据类型

Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。等号(=)用来给变量赋值。等号(=)运算符左边是一个
2023-01-31

Python3 基本数据类型

Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。等号(=)用来给变量赋值。等号(=)运算符左边是一个
2023-01-30

Python3数据类型及转换

I. 数据类型Python3将程序中的任何内容统称为对象(Object),基本的数据类型有数字和字符串等,也可以使用自定义的类(Classes)创建新的类型。Python3中有六个标准的数据类型:Number(数字)String(字符串)L
2023-01-30

【Python3】基本数据类型-列表(

例:name_list = ['alex', 'seven', 'eric']或name_list = list(['alex', 'seven', 'eric'])基本操作:索引切片追加删除长度切片循环包含详细介绍 如下 ~append
2023-01-31

Python3基本数据类型之set

一、定义set是一个无序且不重复的元素集合。集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键。集合支持用in和not in操作符检查成员,由len()内建函数得到集合的基数(大小), 用 for 循环迭代集合的成员。但是因为集合
2023-01-31

【Python3】基本数据类型-元祖(

元组(tuple)元祖为不可被修改的列表,不可变类型 基本操作:索引切片循环长度包含以下为详细介绍 ~count 查找元素个数user_tuple = ('xmzncc','asd','fcc')v = user_tuple.count('
2023-01-31

【Python3】基本数据类型-集合(

集合,不可重复的列表,可变类型difference s1中存在,s2中不存在s1 = {'xmzncc','fcc'}s2 = {'alex','wusir'}v = s1.difference(s2)print(v)s2中存在,s1中不存
2023-01-31

python3的异常类型

BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception      +-- StopIteration      +-- StopA
2023-01-31

python3第二天(基本数据类型)

python3里的变量不需要声明,可直接使用,但使用前,必须先赋值.变量在内存里是没有类型的.多个变量赋值:    1.A=B=C=1;会创建一个值为1的整型对象,三个变量会被分配到相同的内存空间上.当对某一个变量赋值时,会被分配到新的内存
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录