python中的数据类型

python中的数据类型

  1. Python 的用户往往被其易用性所吸引,其中一个易用之处就在于动态输入。静态类型的语言(如 C 或 Java)往往需要每一个变量都明确地声明,而动态类型的语言(例如 Python)可以跳过这个特殊规定。
  2. 但是这种类型灵活性也指出了一个事实: Python 变量不仅是它们的值,还包括了关于值的类型的一些额外信息,本节接下来的
    内容将进行更详细的介绍。
  • Python整型不仅仅是一个整型
    标准的python实现是用 C 语言编写的。这意味着每一个 Python 对象都是一个聪明的伪 C语言结构体,该结构体不仅包含其值,还有其他信息。例如,当我们在 Python 中定义一个整型,例如 x = 10000 时, x 并不是一个“原生”整型,而是一个指针,指向一个 C 语言的复合结构体,结构体里包含了一些值。查看 Python 3.4 的源代码,可以发现整型(长整型)的定义,如下所示(C 语言的宏经过扩展之后):
struct _longobject {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;
    long ob_digit[1];
};

Python 3.4 中的一个整型实际上包括 4 个部分。
• ob_refcnt 是一个引用计数,它帮助 Python 默默地处理内存的分配和回收。
• ob_type 将变量的类型编码。
• ob_size 指定接下来的数据成员的大小。
• ob_digit 包含我们希望 Python 变量表示的实际整型值
这意味着与 C 语言这样的编译语言中的整型相比,在 Python 中存储一个整型会有一些开销,正如图所示。
C整型和Python整型的区别
这里 PyObject_HEAD 是结构体中包含引用计数、类型编码和其他之前提到的内容的部分。
两者的差异在于, C 语言整型本质上是对应某个内存位置的标签,里面存储的字节会编码
成整型。而 Python 的整型其实是一个指针,指向包含这个 Python 对象所有信息的某个内
存位置,其中包括可以转换成整型的字节。由于 Python 的整型结构体里面还包含了大量额
外的信息,所以 Python 可以自由、动态地编码。但是, Python 类型中的这些额外信息也
会成为负担,在多个对象组合的结构体中尤其明显。

  • python列表不仅仅是一个列表
    Python 中的标准可变多元素容器是列表。可以用如下方式创建一个整型值列表:

    In[1]: L = list(range(10))
    L
    Out[1]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    In[2]: type(L[0])
    Out[2]: int

但是想拥有这种灵活性也是要付出一定代价的:为了获得这些灵活的类型,列表中的每一项必须包含各自的类型信息、引用计数和其他信息;也就是说,每一项都是一个完整的Python 对象。来看一个特殊的例子,如果列表中的所有变量都是同一类型的,那么很多信息都会显得多余——将数据存储在固定类型的数组中应该会更高效。动态类型的列表和固定类型的(NumPy 式)数组间的区别如图 2-2 所示。
在实现层面,数组基本上包含一个指向连续数据块的指针。另一方面, Python 列表含一个指向指针块的指针,这其中的每一个指针对应一个完整的 Python 对象(如前面看到的Python 整型)。另外,列表的优势是灵活,因为每个列表元素是一个包含数据和类型信息的完整结构体,而且列表可以用任意类型的数据填充。固定类型的 NumPy 式数组缺乏这种灵活性,但是能更有效地存储和操作数据。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值