为什么这三种创建列表的方式在内存大小上存在差异?

Moo*_*dra 5 python python-3.x

sys.getsizeof(list(range(10))) # 200
sys.getsizeof([0,1,2,3,4,5,6,7,8,9]) # 144
sys.getsizeof([i for i in range(10)]) # 192
Run Code Online (Sandbox Code Playgroud)

我几乎没有C方面的经验,所以这可能使我感到头疼,但是我在玩耍时很好奇sys.getsizeof

我试图看一下文档,但是我发现只有这样:

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

由于我的C经验很少,所以我对GC也不太熟悉,但是从与Python有关的GC阅读中,我了解到Python中仅计数引用。在上述情况下,我们没有将其保存到变量中,所以我假设没有GC引用吗?

Dob*_*irM 5

似乎在使用list()range()函数时python会分配一些额外的内存。如果使用将生成的数组中的值复制到新数组中[:],则可以看到它们相等。

例:

import sys

sys.getsizeof(list(range(10))[:]) # 144
sys.getsizeof([0,1,2,3,4,5,6,7,8,9][:]) # 144
sys.getsizeof([i for i in range(10)][:]) # 144
Run Code Online (Sandbox Code Playgroud)