导入
深入探究
了解 pickle 模块适合保存程序进度及其可存储的数据类型
表面上,序列化的概念很简单。你有一个内存中的数据结构,想要保存它、重复使用它,或者发送给其他人。该如何实现?这取决于你希望如何保存它、如何重复使用它,以及要发送给谁。许多游戏在退出时允许你保存进度,重新启动游戏后可以从中断处继续。实际上,许多非游戏类应用程序也具备类似功能。在这种情况下,需要将“当前进度”的数据结构在退出时保存到磁盘,重新启动时再从磁盘加载。这些数据仅由创建它的同一程序使用,不会通过网络传输,也不会被其他任何程序读取。因此,互操作性问题主要集中在确保程序的后续版本能够读取早期版本写入的数据。
对于这类场景,pickle 模块非常合适。它是 Python 标准库的一部分,始终可用。它运行速度快,大部分代码用 C 编写,与 Python 解释器本身一样高效。它可以存储任意复杂的 Python 数据结构。
pickle 模块可以存储哪些内容?
- Python 支持的所有原生数据类型:布尔值、整数、浮点数、复数、字符串、
bytes对象、字节数组和 None。 - 包含任意组合原生数据类型的列表、元组、字典和集合。
- 包含任意组合列表、元组、字典和集合的列表、元组、字典和集合,这些嵌套结构可包含原生数据类型(以此类推,直到达到 Python 支持的最大嵌套深度)。
- 函数、类以及类的实例(有注意事项)。
如果这些还不够用,pickle 模块还支持扩展。如果你对扩展性感兴趣,请参阅本章末尾的进一步阅读部分提供的链接。
本章示例说明
本章通过两个 Python Shell 展开一个故事。本章中的所有示例都属于同一个连贯的情节。在演示 pickle 和 json 模块时,你需要在两个 Python Shell 之间来回切换。
为了帮助理清思路,请打开一个 Python Shell 并定义以下变量:
1shell = 1
保持该窗口打开。然后打开另一个 Python Shell,并定义以下变量:
1shell = 2
在本章中,我将使用 shell 变量来标明每个示例所使用的 Python Shell。