字典——重新审视嵌套

未匹配的标注

在前面例子中,使用字典和三个键来描述一个假想的人。然而,假设信息更加复杂。可能需要记录姓和名还有多个工作头衔。这导致了实践中Python对象嵌套的另一个应用。下面被一次性编码为一个字面量的字典,捕获了更多结构化的信息:

>>> rec = {'name': {'first': 'Bob', 'last': 'Smith'},
           'jobs': ['dev', 'mgr'],
           'age': 40.5}

这里再次在顶部设置了一个三键的字典(键为“name”,“job”和“age”),但值变得更复杂:‘name’ 是一个嵌套字典以支持多部分,‘job’ 是一个嵌套列表以支持多个角色和未来的扩展。可以用和之前对基于列表的矩阵一样的方式访问这个结构的组件,但这次大多数索引是字典键,而非列表偏移量:

>>> rec['name'] # 'name' 是一个嵌套字典
{'last': 'Smith', 'first': 'Bob'}
>>> rec['name']['last'] # 索引嵌套字典
'Smith'
>>> rec['jobs'] # 'jobs' 是一个嵌套列表
['dev', 'mgr']
>>> rec['jobs'][-1] # 索引嵌套列表
'mgr'
>>> rec['jobs'].append('janitor') # 就地扩展Bob的工作描述
>>> rec
{'age': 40.5, 'jobs': ['dev', 'mgr', 'janitor'], 'name': {'last':
'Smith','first': 'Bob'}}

注意这里最后一个操作扩展了嵌套的工作列表——因为工作列表是和包含它的字典分开的一个内存块,能自由的增长和收缩(对象内存布局在本书后面将进一步讨论)。

展示这个例子的真实原因是展示Python的核心对象类型的灵活性。可以看到,嵌套允许直接轻松地构建复杂的信息结构。在像C这样的低级语言中构建一个类似的结构将是枯燥的,且需要多得多的代码:我们将不得不布局和声明结构和数组,填充值,把所有东西链接起来等等。在Python中,这全是自动的——运行这个表达式为我们创建了整个嵌套对象结构。事实上,这是像Python这种脚本语言的主要优点之一。

同样重要的是,在低级语言中当不需要时,我们将不得不小心的清理所有对象空间。在Python中,当失去对象的最后引用时——比如,通过将变量指向其他对象或将不同值赋给变量——所有被那个对象的结构占用的内存空间会被自动清理

>>> rec = 0 # 现在对象空间被回收

实际应用:list 作为参数传参的 不能把参数带回来的问题? | Python | Python 技术论坛

技术上讲,Python拥有被称为垃圾回收的功能,当程序运行时清理不用的内存和不必在代码中管理这些细节。在标准的Python(也就是 CPython)中,只要对象的最后引用被移除,空间就被立即回收。随后第6章将学习这是如何工作的;暂时地,知道可以自由地使用对象,无许担心在程序执行过程中创建空间或清理空间就足够了。

在第8章,第9章和第27章还要留意一个类似于我们刚编码的记录结构,在那里将用它来比较列表,字典,元组,命名元组和类(一组带有权衡的数据结构选项,将在后面详细解释[14])的异同。


注14:这里是两条应用笔记。首先,作为一个预览,当使用Python的对象持久化系统(在简单文件或按键访问的数据库中存储原生Python对象的一个简单方式,它自动在对象和字节流之间进行转换)时,刚创建的rec记录其实可以是一条真实的数据库记录。我们不会在这里深入细节,但留意在第9章,第28章,第31章和第37章(在那里,将分别在文件,一个OOP用例,类和3.X的变更的上下文中探索它们)中对Python的 pickleshelve 持续化模块的讨论。

第二,如果熟悉JSON(JavaScript 对象标识法)——一个新兴的用于数据库和网络传输的数据交换格式——这个例子可能也看起来出奇地熟悉,虽然Python对变量,任意表达式和更改的支持能让它的数据结构更通用。Python的 json 库模块支持创建和解析JSON文本,所以转换成Python对象通常很容易。在第9章学习文件时,留意使用这个记录的一个 JSON 例子。对于更大的用例,参见MongoDB,它使用类JSON文档的与语言无关的二进制编码序列化,和它的PyMongo接口。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~