为什么从列表中创build列表使其变大?

我在使用sys.getsizeof时应该看到一些不一致的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 

有人有简单的解释吗?

使用列表文字,虚拟机创build具有设定长度的列表。 当将一个序列传递给list()构造函数时,元素将逐个添加(通过list.extend() ),因此列表将在适当的时候resize。 由于resize操作为了分摊成本而重新定位,最终列表通常会比源列表大。

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