龙空技术网

「3」如何理解Python中的数据类型的指针存储方式

七里飞浪 224

前言:

今天咱们对“python定义结构体指针”都比较重视,我们都需要剖析一些“python定义结构体指针”的相关知识。那么小编也在网摘上汇集了一些对于“python定义结构体指针””的相关知识,希望我们能喜欢,兄弟们快快来学习一下吧!

在很多Python技术类书籍中,经常看到Python中的类型对象存储的是指针,但一直无法从更深层次去理解这种设计的目的。希望下面这篇文章能从语言设计出发,来一番探索。

###### 1、Python是动态类型语言,可以动态输入 ######

#Python中的数据类型是动态推断的,可将任何类型的数据指定给任何变量

x = 4x = 'four'

这里将x变量的内容由整型转变成了字符串

区别于其它静态语言例如C,需要先明确声明变量类型。以上同样的赋值操作,在C语言中会出现编译错误。

如下:

int x = 4;x = 'four'; //编译失败

###### 2、指针设计带来的固定列表与动态列表 ######

Python中的整型只是一个指针,指向包含这个对象所有信息的某个内存位置

标准的Python是由C语言编写,本质上每个Python对象都是一个伪C语言结构体

如下是Python源码中长整型的定义和说明

 struct _longobject {  long ob_refcnt; --引用计数,帮Python处理内存的分配和回收 PyTypeObject *ob_type; --将变量的类型编码  size_t ob_size; --指定数据成员的大小 long ob_digit[1]; --Python变量表示的实际整型值 };

例: Python中,x = 1000 时,x并非一个”原生“整型,而是一个指针,指向一个C语言的复合结构体。

PyObject_HEAD 是结构体中包含引用计数、类型编码等其它信息

Python对象的结构体中包含的额外信息,有如下影响

优点:Python可以自由、动态编码

缺点:相比于C语言等静态语言,会有额外的开销,在多个对象组合的结构体中会成为负担

#固定类型列表:所有元素的类型相同,导致每个元素对象各自的类型信息、引用计数等会有冗余

lst1 = list(range(10))print(type(lst1[0]))

#动态类型列表:利用Python的动态特性,创建异构列表,包信不同类型的元素,导致每个元素对象都维护一套各自的类型信息、引用计数等

lst2 = [True,'2',0,3.4]print(list(type(item) for item in lst2))

列表对象中兼容不同的数据类型

######3、Python列表与Numpy数组的区别 ######

Python 列表结构灵活但处理低效 - 包含一个指向指针块的指针,这其中的每一个指针对应一个完整的 Python 对象 。

Numpy 数组结构固定但处理高效 - 它包含一个指向连续数据块的指针

Numpy数组与Python列表存储区别

标签: #python定义结构体指针