2 回答

TA贡献1827条经验 获得超8个赞
抱歉,以前的评论有点简短。
发生的事情是您正在查看列表的分配方式(我想也许您只是想看看有多大的东西-在这种情况下,请使用sys.getsizeof())
将某些内容添加到列表时,可能会发生以下两种情况之一:
多余的物品适合剩余空间
需要额外的空间,因此将创建一个新列表,并复制内容,并添加其他内容。
由于(2)昂贵(复制事物,甚至指针,花费的时间与要复制的事物的数量成正比,因此随着列表的增加而增加),我们不希望这样做。因此,我们添加了一个完整的块,而不是仅添加更多的空间。通常,添加量的大小类似于已使用的数量-这样一来,数学计算得出,分配给许多用途的平均内存分配成本仅与列表大小成比例。
因此您所看到的与此行为有关。我不知道确切的详细信息,但是如果[]或[1](或两者)是特殊情况,即仅分配足够的内存(在这些常见情况下可以节省内存),然后追加“获取一个” ,我不会感到惊讶。上面介绍的“新块”中添加了更多内容。
但是我不知道确切的细节-这只是动态数组的一般工作方式。将对python中列表的确切实现进行微调,以使其最适合典型的python程序。因此,我真正要说的是,您不能相信列表的大小来确切地告诉您其中包含多少-它可能包含额外的空间,并且额外的可用空间量很难判断或预测。
ps的一种很好的替代选择是将列表(value, pointer)成对,其中每个指针都指向下一个元组。这样,尽管使用的总内存更高,但是您可以递增地增加列表。那是一个链表(python使用的更像是向量或动态数组)。
[更新]请参阅Eli的出色答案。他/她解释说,[]和[1]都被完全分配,但是追加到会[]分配额外的块。代码中的注释就是我在上面所说的(这称为“超额分配”,金额与我们所拥有的金额成比例,因此平均(“摊销”)成本与规模成正比)。
添加回答
举报