Python数据类型

139 阅读9分钟

@TOC

O. 前言

Python一切皆对象,可以使用 type() 函数获取任何对象的数据类型;

Python 的赋值语句不复制对象,而是创建目标和对象的绑定关系。对于自身可变,或包含可变项的集合,有时要生成副本用于改变操作,而不必改变原始对象。这时可以采用 copy 模块 所提供的通用浅层复制和深层复制操作:
● 获取 x 的浅层复制:copy.copy(x)
● 获取 x 的深层复制:copy.deepcopy(x[, memo])

浅层与深层复制的区别 仅与复合对象(即包含列表或类的实例等其他对象的对象)相关:

浅层复制 构造一个新的复合对象,然后(在尽可能的范围内)将原始对象中找到的对象的 引用 插入其中。
深层复制 构造一个新的复合对象,然后,递归地将在原始对象里找到的对象的 副本 插入其中。

深度复制操作通常存在(而浅层复制操作并不存在)的两个问题:

● 递归对象 (直接或间接包含对自身引用的复合对象) 可能会导致递归循环。
● 由于深层复制会复制所有内容,因此可能会过多复制(例如本应该在副本之间共享的数据)。

Ⅰ. Python基本数据类型:

数字类型、文本类型、布尔类型、二进制类型、基本日期和时间类型。

基本数据类型关键字描述
数字类型intfloatcomplex由数字字面值或内置函数与运算符的结果来创建的。 不带修饰的整数字面值(包括十六进制、八进制和二进制数)会生成 整数; 包含小数点或幂运算符的数字字面值会生成 浮点数; 在数字字面值末尾加上 'j' 或 'J' 会生成虚数(实部为零的复数),可以将其与整数或浮点数相加来得到具有实部和虚部的 复数
文本类型str由引号所包含的字符集合,引号可以是单引号、双引号或者三引号(三个连续的单引号或者双引号)。
布尔类型bool只有两种取值:True 和 False。如果将布尔值进行数值运算,True会被当作整型1,False会被当作整型0。
二进制类型bytesbytearraymemoryviewbytes 和 bytearray由 memoryview 提供支持,使用 缓冲区协议 来访问其他二进制对象所在内存,不需要创建对象的副本。
基本日期和时间类型datetime,datetime, calendar, timezone,zoneinfo不可变对象,可以用作字典键,支持通过 pickle 模块进行高效的封存。

Ⅰ.1 补充 - 二进制类型

类型名称构建方式
 bytes  表示 bytes 字面值的语法与字符串字面值的大致相同,只是添加了一个 b 前缀;bytes 字面值中只允许 ASCII 字符(无论源代码声明的编码为何)。 任何超出 127 的二进制值必须使用相应的转义序列形式加入 bytes 字面值。
bytearray创建一个空实例: bytearray();创建一个指定长度的以零值填充的实例: bytearray(10);通过由整数组成的可迭代对象构建: bytearray(range(20));通过缓冲区协议复制现有的二进制数据构建: bytearray(b'Hi!')

Ⅰ.2 补充 - 基本日期和时间类型

类型名称描述
date 提供了理想化历法中的日期(年、月和日),在布尔运算中,所有 date 对象都会被视为真值。
time提供了时间的访问和转换
datetime 包含来自 date 对象和 time 对象的所有信息,提供了用于处理日期和时间的方法。创建表示当前 UTC 时间对象的推荐方式是通过调用 datetime.now(timezone.utc)
calendar提供了通用日历相关函数
timezone 其每个实例都代表一个以与 UTC 的固定时差来定义的时区。
zoneinfo 提供了 IANA 时区数据库的具体时区。

Ⅱ. Python容器数据类型:

序列类型、优先队列、集合类型、映射类型、图类型、deque等其他类型容器。

容器数据类型关键字描述
序列类型listarraytuplerangelist 和array是可变序列,通常用于存放同类项目的集合;tuple是不可变序列,通常用于储存异构数据的多项集;range 类型表示不可变的数字序列,通常用于在 for 循环中循环指定的次数。
优先队列heapq优先队列,也称为堆队列。堆是一个二叉树,它的每个父节点的值都只会小于或等于所有孩子节点(的值)。由数组来实现,为了便于比较,不存在的元素被认为是无限大。可以通过一个函数 heapify() 把一个 list 转换成堆。
集合类型setfrozenset是由具有唯一性的 hashable 对象所组成的无序多项集,与其他多项集一样,集合也支持 x in setlen(set) 和 for x in set。其中,set为可变对象;frozenset为不可变对象。
映射类型dict可变对象,用于存储以逗号分隔的 键: 值 对。一般是唯一且不可变的,如字符串,数字或元组(如果重复,最后的一个键值对会替换前面的);不需要唯一。
图类型graphlib提供了处理类似图的结构的功能、方法。
其他类型容器deque, ChainMap, Counter, OrderedDict, defaultdict,UserDict, UserList, UserStringcollections 模块实现了这些特定的容器。

Ⅱ.1 补充 - 序列类型

序列类型名称构建方式
list可变对象,使用一对方括号来表示空列表: [];使用方括号,其中的项以逗号分隔: [a][a, b, c];使用列表推导式: [x for x in iterable];使用类型的构造器: list() 或 list(iterable)
array其行为与列表非常相似,不同之处在于其中存储的对象类型是受限的。 类型在对象创建时使用单个字符的 类型码 来指定。注:这并非是指NumPy 软件包里的数组类型
tuple不可变对象,使用一对圆括号来表示空元组: ();使用一个后缀的逗号来表示单元组: a, 或 (a,);使用以逗号分隔的多个项构建元组: a, b, c or (a, b, c);使用内置的 tuple()tuple() 或 tuple(iterable)构建元组
range 不可变对象,构建方式:range(stop); range(startstop[, step])。构造器的参数必须为整数。 如果省略 step 参数,则默认为 1。 如果省略 start 参数,则默认为 0。

注:bisect 模块使用了基本的二分(bisection)算法,对有序列表提供了支持,使其可以在插入新数据仍然保持有序。包含边界判断!

Ⅱ.2 补充 - 集合类型

类型名称说明
set 可变对象 --- 其内容可以使用 add() 和 remove() 这样的方法来改变。 由于是可变类型,它没有哈希值,且不能被用作字典的键或其他集合的元素。
 frozenset 不可变对象,并且为 hashable --- 其内容在被创建后不能再改变;因此它可以被用作字典的键或其他集合的元素。

两个类的构造器具有相同的作用方式:

  • class set([iterable])
  • class frozenset([iterable])

返回一个新的 set 或 frozenset 对象,其元素来自于 iterable。 如果未指定 iterable,则将返回一个新的空集合。集合可用多种方式来创建:

使用花括号内以逗号分隔元素的方式: {'jack', 'sjoerd'}
使用集合推导式: {c for c in 'abracadabra' if c not in 'abc'}
使用类型构造器: set()set('foobar')set(['a', 'b', 'foo'])

Ⅱ.3 补充 - 映射类型

目前仅有一种标准映射类型 dict,可用多种方式来创建 dict:
● 使用花括号内以逗号分隔 键: 值 对的方式: {'jack': 4098, 'sjoerd': 4127} or {4098: 'jack', 4127: 'sjoerd'}
● 使用字典推导式: {}{x: x ** 2 for x in range(10)}
● 使用类型构造器: dict()dict([('foo', 100), ('bar', 200)])dict(foo=100, bar=200)

由 dict.keys()dict.values() 和 dict.items() 所返回的对象是 视图对象。 该对象提供字典条目的一个动态视图,这意味着当字典改变时,视图也会相应改变。字典视图可以被迭代以产生与其对应的数据,且支持成员检测。

此外,collections 模块实现了如下容器:

容器名称容器描述
namedtuple()创建命名元组子类的工厂函数
deque类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)
ChainMap类似字典(dict)的容器类,将多个映射集合到一个视图里面
Counterdict subclass for counting hashable objects
OrderedDict字典的子类,保存了他们被添加的顺序
defaultdict字典的子类,提供了一个工厂函数,为字典查询提供一个默认值
UserDict封装了字典对象,简化了字典子类化
UserList封装了列表对象,简化了列表子类化
UserString封装了字符串对象,简化了字符串子类化

end.友情链如有疑问可留言沟通交流end. 友情链接^{如有疑问可留言沟通交流}

  1. C++数据类型及标准库容器 (Standard Template Library Containers)
  2. 点云文章专栏
  3. Visual studio文章专栏
  4. ...

代码调试不易,转载请标明出处!
如果感觉本文对您有帮助,请留下您的赞,您的支持是我坚持写作分享的最大动力,谢谢!

References
0.Python 官方文档
1.数据类型 — Python 3.11.4 文档
2.apiref.com/python-zh/
3.Python 数据类型 | w3school
4.Python3 基本数据类型 | 菜鸟教程
5.
6.
7.
可以肯定的是学海无涯,这篇文章也会随着对 Python 的深入学习而持续更新,
欢迎各位在评论区留言进行探讨交流。