所以我正在玩list对象,并发现一些奇怪的事情,如果list创建list()它使用更多的内存,而不是列表理解?我正在使用Python 3.5.2
In [1]: import sys
In [2]: a = list(range(100))
In [3]: sys.getsizeof(a)
Out[3]: 1008
In [4]: b = [i for i in range(100)]
In [5]: sys.getsizeof(b)
Out[5]: 912
In [6]: type(a) == type(b)
Out[6]: True
In [7]: a == b
Out[7]: True
In [8]: sys.getsizeof(list(b))
Out[8]: 1008
Run Code Online (Sandbox Code Playgroud)
来自文档:
列表可以通过以下几种方式构建:
- 使用一对方括号表示空列表:
[]- 使用方括号,用逗号分隔项目:
[a],[a, b, c]- 使用列表理解:
[x for x in iterable]- 使用类型构造函数:
list()或list(iterable)
但似乎使用list()它会占用更多内存. …
我正在阅读O'Reilly 出版的 Luciano Ramalho所著的Fluent Python一书。在第二章中,作者提出了一个定义容器序列和平面序列的有趣语句。
容器序列:list、tuple 和 collections.deque 可以容纳不同类型的项目。
平面序列:str、bytes、bytearray、memoryview 和 array.array 保存一种类型的项目。
然后他继续说:-
容器序列保存对它们包含的对象的引用,这些对象可以是任何类型,而平面序列物理地将每个项目的值存储在其自己的内存空间中,而不是作为不同的对象。因此,平面序列更紧凑,但它们仅限于保存原始值,如字符、字节和数字。*
这让我想到,如果列表存储对它们正在存储的对象的引用,那么像数组这样的平面序列以什么方式存储其元素的值?作者说扁平序列物理存储了每个项目的价值。他是什么意思?
这是我第一次提问。请原谅我在这方面缺乏知识。