1

我已经开始学习数据结构和算法。请帮助我解决我的疑问。

  1. 可以说列表、元组和字典是一种引用数组吗?

  2. 我正在浏览书中的示例,其中写道,我们需要一个医疗信息系统来跟踪当前分配到某家医院病床的患者。如果我们假设医院有 200 张病床,并且这些病床的编号从 0 到 199 很方便,我们可能会考虑使用基于数组的结构来维护当前分配给这些病床的患者姓名。例如,在 Python 中,我们可能会使用名称列表,例如:

[雷内,约瑟夫,珍妮特,乔纳斯,海伦,弗吉尼亚,...]

为了用数组表示这样的列表,Python 必须遵守数组的每个单元使用相同字节数的要求。然而元素是字符串,字符串自然有不同的长度。Python 可以尝试为每个单元保留足够的空间来保存最大长度的字符串(不仅是当前存储的字符串,还包括我们可能想要存储的任何字符串),但这会很浪费。相反,Python 使用对象引用数组的内部存储机制来表示列表或元组实例。在最低级别,存储的是序列元素所在的连续内存地址序列。图 1 显示了此类列表的高级图

https://i.stack.imgur.com/7FffP.jpg

我的理解是python存储“Rene”或“Joseph”的内存地址。但是内存地址也会随着名称中的字符数而改变,比如每个 Unicode 占用 2 个字节的空间。

现在还写到“虽然各个元素的相对大小可能会有所不同,但用于存储每个元素的内存地址的位数是固定的(例如,每个地址 64 位,即 8 个字节)。如果字符很长并且不能以 64 位存储内存地址?

4

1 回答 1

-1

可以说列表、元组和字典是一种引用数组吗?

列表是(尽管它们内置了动态调整大小可能很重要),但元组和字典在幕后还有很多事情要做。

我的理解是python存储“Rene”或“Joseph”的内存地址。但是内存地址也会随着名称中的字符数而改变,比如每个 Unicode 占用 2 个字节的空间。

内存地址是一个整数,描述在哪里可以找到数据,而数据本身是一串字节,如b'Rene'. 我不确定 CPython 使用什么来确定数据结构的结束位置,但常见的方法包括空终止符(当给定地址时,您找到的所有字节都是数据结构的一部分,直到您遇到空字节),确保每个对象的大小相同,因此您可以向前跳过(对于字符串不可行),或者让第一个字节描述对象其余部分的长度。地址本身具有固定大小,例如,64 位。

在下图中,引用数组中使用的“地址”将是 3,并且您会知道字符串的最后一个字节发生在地址 6 上,直到找到空字节(我提到的其他方法类似) . 重要的是 3 是引用数组需要存储才能引用的唯一数字b'Rene'

|3|4|5|6|7 |
|R|e|n|e|\0|

如果字符很长并且无法以 64 位存储内存地址怎么办?

这实际上是 32 位系统不能使用超过 4GB 的 RAM 的原因——它们只有 32 位标识符来访问 RAM(没有额外的技术,例如为每个进程分配一个 RAM 偏移量,以便每个进程都有一个 32-位存储空间)。现代 64 位系统允许对 16 EB 的 RAM 进行索引,而无需任何其他特殊技术——这是 32 -> 64 位迁移的主要动机之一。

但无论如何,内存限制是真实存在的,如果我们开始需要处理比这更多的内存,我们将需要使用比固定宽度整数引用更复杂的策略,或者我们需要再次跳起来使用更大的整数。

于 2020-07-02T00:54:57.777 回答