@TOC
O. 前言
Python一切皆对象,可以使用 type() 函数获取任何对象的数据类型;
Python 的赋值语句不复制对象,而是创建目标和对象的绑定关系。对于自身可变,或包含可变项的集合,有时要生成副本用于改变操作,而不必改变原始对象。这时可以采用 copy 模块 所提供的通用浅层复制和深层复制操作:
● 获取 x 的浅层复制:copy.copy(x)
● 获取 x 的深层复制:copy.deepcopy(x[, memo])
浅层与深层复制的区别 仅与复合对象(即包含列表或类的实例等其他对象的对象)相关:
● 浅层复制 构造一个新的复合对象,然后(在尽可能的范围内)将原始对象中找到的对象的 引用 插入其中。
● 深层复制 构造一个新的复合对象,然后,递归地将在原始对象里找到的对象的 副本 插入其中。深度复制操作通常存在(而浅层复制操作并不存在)的两个问题:
● 递归对象 (直接或间接包含对自身引用的复合对象) 可能会导致递归循环。
● 由于深层复制会复制所有内容,因此可能会过多复制(例如本应该在副本之间共享的数据)。
Ⅰ. Python基本数据类型:
数字类型、文本类型、布尔类型、二进制类型、基本日期和时间类型。
| 基本数据类型 | 关键字 | 描述 |
|---|---|---|
| 数字类型 | int, float, complex | 由数字字面值或内置函数与运算符的结果来创建的。 不带修饰的整数字面值(包括十六进制、八进制和二进制数)会生成 整数; 包含小数点或幂运算符的数字字面值会生成 浮点数; 在数字字面值末尾加上 'j' 或 'J' 会生成虚数(实部为零的复数),可以将其与整数或浮点数相加来得到具有实部和虚部的 复数。 |
| 文本类型 | str | 由引号所包含的字符集合,引号可以是单引号、双引号或者三引号(三个连续的单引号或者双引号)。 |
| 布尔类型 | bool | 只有两种取值:True 和 False。如果将布尔值进行数值运算,True会被当作整型1,False会被当作整型0。 |
| 二进制类型 | bytes, bytearray, memoryview | bytes 和 bytearray由 memoryview 提供支持,使用 缓冲区协议 来访问其他二进制对象所在内存,不需要创建对象的副本。 |
| 基本日期和时间类型 | date, time,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等其他类型容器。
| 容器数据类型 | 关键字 | 描述 |
|---|---|---|
| 序列类型 | list, array, tuple, range | list 和array是可变序列,通常用于存放同类项目的集合;tuple是不可变序列,通常用于储存异构数据的多项集;range 类型表示不可变的数字序列,通常用于在 for 循环中循环指定的次数。 |
| 优先队列 | heapq | 优先队列,也称为堆队列。堆是一个二叉树,它的每个父节点的值都只会小于或等于所有孩子节点(的值)。由数组来实现,为了便于比较,不存在的元素被认为是无限大。可以通过一个函数 heapify() 把一个 list 转换成堆。 |
| 集合类型 | set, frozenset | 是由具有唯一性的 hashable 对象所组成的无序多项集,与其他多项集一样,集合也支持 x in set, len(set) 和 for x in set。其中,set为可变对象;frozenset为不可变对象。 |
| 映射类型 | dict | 可变对象,用于存储以逗号分隔的 键: 值 对。键一般是唯一且不可变的,如字符串,数字或元组(如果重复,最后的一个键值对会替换前面的);值不需要唯一。 |
| 图类型 | graphlib | 提供了处理类似图的结构的功能、方法。 |
| 其他类型容器 | deque, ChainMap, Counter, OrderedDict, defaultdict,UserDict, UserList, UserString | collections 模块实现了这些特定的容器。 |
Ⅱ.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(start, stop[, 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封装了字符串对象,简化了字符串子类化
代码调试不易,转载请标明出处!
如果感觉本文对您有帮助,请留下您的赞,您的支持是我坚持写作分享的最大动力,谢谢!
References
0.Python 官方文档
1.数据类型 — Python 3.11.4 文档
2.apiref.com/python-zh/
3.Python 数据类型 | w3school
4.Python3 基本数据类型 | 菜鸟教程
5.
6.
7.
可以肯定的是学海无涯,这篇文章也会随着对 Python 的深入学习而持续更新,
欢迎各位在评论区留言进行探讨交流。