在将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
有人有简单的解释吗?
答案 0 :(得分:54)
使用列表文字,VM会创建具有设定长度的列表。将序列传递给list()
构造函数时,元素将逐个添加(通过list.extend()
),因此在适当时调整列表大小。由于resize operation为了分摊费用而进行了总分配,因此最终列表通常会大于源列表。
答案 1 :(得分:11)
创建列表文字时,报告的大小是保存数据所需的最小大小。你可以看到这个,因为如果你附加一个元素,大小会跳起来。但是,当你使用list
来复制它时,它会分配一些额外的空间 - 在重新分配之前需要一些附加内容(在你的情况下,我怀疑第8个附加将执行它 - 每个元素需要4个字节) 。这些分配行为可能有所不同,但我不确定这可能是什么。