为什么从列表中创建列表会使其更大?

时间:2014-12-18 19:44:47

标签: python list python-internals

在将sys.getsizeof用于相同列表时,我发现了一些不一致之处。 (Python 2.7.5)

>>> lst = [0,1,2,3,4,5,6,7,8,9]
>>> sys.getsizeof(lst)
76
>>> lst2 = list(lst)
>>> sys.getsizeof(lst2)
104
>>> lst3 = list(lst2)
>>> sys.getsizeof(lst3)
104
>>> sys.getsizeof(lst[:])
76
>>> sys.getsizeof(lst2[:])
76

有人有简单的解释吗?

2 个答案:

答案 0 :(得分:54)

使用列表文字,VM会创建具有设定长度的列表。将序列传递给list()构造函数时,元素将逐个添加(通过list.extend()),因此在适当时调整列表大小。由于resize operation为了分摊费用而进行了总分配,因此最终列表通常会大于源列表。

答案 1 :(得分:11)

创建列表文字时,报告的大小是保存数据所需的最小大小。你可以看到这个,因为如果你附加一个元素,大小会跳起来。但是,当你使用list来复制它时,它会分配一些额外的空间 - 在重新分配之前需要一些附加内容(在你的情况下,我怀疑第8个附加将执行它 - 每个元素需要4个字节) 。这些分配行为可能有所不同,但我不确定这可能是什么。