为什么从列表中创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行为可能有所不同,但我不确定这可能是什么原因。