Python a=[0]和a=[i代表范围(1)内的i]之间的sizeof差异

Python a=[0]和a=[i代表范围(1)内的i]之间的sizeof差异,python,object,memory,memory-management,sizeof,Python,Object,Memory,Memory Management,Sizeof,我用两种不同的方式用相同的元素创建了两个单独的列表a和b。为什么这两个列表的大小不同 import sys a = [0] print(a) >>> [0] print(sys.getsizeof(a)) >>> 72 b = [i for i in range(1)] print(b) >>> [0] print(sys.getsizeof(b)) >>> 96 当解释器看到a=[0]时,它知道它可以用一个元素构建一个

我用两种不同的方式用相同的元素创建了两个单独的列表
a
b
。为什么这两个列表的大小不同

import sys
a = [0]
print(a)
>>> [0]
print(sys.getsizeof(a))
>>> 72

b = [i for i in range(1)]
print(b)
>>> [0]
print(sys.getsizeof(b))
>>> 96

当解释器看到
a=[0]
时,它知道它可以用一个元素构建一个列表


当它进行列表理解时,它首先创建一个空列表,然后在执行时附加项目。它事先不知道列表会有多大,即使它在一些简单的东西上迭代,比如
range(1)
。因此,它试图猜测要分配多少内存,如果结果证明这还不够,它将不得不动态增加内存分配。这并不便宜,所以它可能从一个慷慨的猜测开始。

您正在经历过度分配。相关的:我甚至会认为这是一个复制品。但是TL:DR list literal将udneraying缓冲区分配到保存该列表所需的确切长度,而list comphrenesis本质上是使用
.append
,这将使用overallocation.thanking@juanpa.arrivillaga标记的for循环!另一个涉及到内部的相关问题: