为什么列表的(深层)副本比原始列表消耗更多的内存?

时间:2019-01-30 16:16:36

标签: python

import sys, copy

x = [None]
y = x
c = copy.copy(x)
dc = copy.deepcopy(x)

print(x, y, c, dc)          # [None] [None] [None] [None]
print(sys.getsizeof([0]))   # 72
print(sys.getsizeof(["0"])) # 72
print(sys.getsizeof(x))     # 72
print(sys.getsizeof(y))     # 72
print(sys.getsizeof(c))     # 96
print(sys.getsizeof(dc))    # 96

我了解到sys.getsizeofdocs)返回容器(列表)本身的大小,而不考虑内容,因此我知道它返回的大小相同( 72 [0], [None] and ["0"]

但是,为什么一个副本或深层副本需要更多的内存来保存相同的数据( 96 ,而不是 72 )?

docs状态:

  

getsizeof()调用对象的__sizeof__方法,如果该对象由垃圾收集器管理,则会添加额外的垃圾收集器开销。

因此,造成这种差异的唯一合理原因是垃圾回收器对副本的处理方式不同,对吗?但是为什么呢?

我的环境:Win 10,Python 3.4.3 64位

1 个答案:

答案 0 :(得分:3)

列表使用大小调整策略,该策略有时涉及在末端保留备用空间以容纳更多元素,以确保摊销固定时间的追加。您的某些列表最后具有比其他列表更多的可用空间。 Python不保证任何列表都会有多少可用空间。