列表和数组在存储值时有何不同?

我正在阅读O'Reilly 出版的 Luciano Ramalho所著的Fluent Python一书。在第二章中,作者提出了一个定义容器序列和平面序列的有趣语句。

容器序列:list、tuple 和 collections.deque 可以容纳不同类型的项目。

平面序列:str、bytes、bytearray、memoryview 和 array.array 保存一种类型的项目。

然后他继续说:-

容器序列保存对它们包含的对象的引用,这些对象可以是任何类型,而平面序列物理地将每个项目的值存储在其自己的内存空间中,而不是作为不同的对象。因此,平面序列更紧凑,但它们仅限于保存原始值,如字符、字节和数字。*

这让我想到,如果列表存储对它们正在存储的对象的引用,那么像数组这样的平面序列以什么方式存储其元素的值?作者说扁平序列物理存储了每个项目的价值。他是什么意思?

这是我第一次提问。请原谅我在这方面缺乏知识。

回答

只是为了演示起见, Imagineint不是原始类型。然后保存值本身的数组将是这样的

Address  0xaddr0  0xaddr1  0xaddr2
        +--------+--------+--------+
Content |   69   |  420   |  1337  |
        +--------+--------+--------+

保存地址(参考)的列表将是这样的

Address   0xaddr0   0xaddr1   0xaddr2    0xaddr3   0xaddr4   0xaddr5
        +---------+---------+---------+
Content | 0xaddr3 | 0xaddr4 | 0xaddr5 |    69        420      1337
        +---------+---------+---------+    ^          ^        ^
             |         |         |         |          |        |
             +---------+---------+---------+          |        |
                       |         |                    |        |
                       +---------+--------------------+        |
                                 |                             |
                                 +-----------------------------+

因此,当您从数组中获取值时,您会立即获取它;但是对于列表,您会获得该值的地址,然后转到该地址以实际获取该值。


以上是列表和数组在存储值时有何不同?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>