列表和数组在存储值时有何不同?
我正在阅读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
+---------+---------+---------+ ^ ^ ^
| | | | | |
+---------+---------+---------+ | |
| | | |
+---------+--------------------+ |
| |
+-----------------------------+
因此,当您从数组中获取值时,您会立即获取它;但是对于列表,您会获得该值的地址,然后转到该地址以实际获取该值。