2 回答

TA貢獻1890條經驗 獲得超9個贊
抱歉,以前的評論有點簡短。
發生的事情是您正在查看列表的分配方式(我想也許您只是想看看有多大的東西-在這種情況下,請使用sys.getsizeof())
將某些內容添加到列表時,可能會發生以下兩種情況之一:
多余的物品適合剩余空間
需要額外的空間,因此將創建一個新列表,并復制內容,并添加其他內容。
由于(2)昂貴(復制事物,甚至指針,花費的時間與要復制的事物的數量成正比,因此隨著列表的增加而增加),我們不希望這樣做。因此,我們添加了一個完整的塊,而不是僅添加更多的空間。通常,添加量的大小類似于已使用的數量-這樣一來,數學計算得出,分配給許多用途的平均內存分配成本僅與列表大小成比例。
因此您所看到的與此行為有關。我不知道確切的詳細信息,但是如果[]或[1](或兩者)是特殊情況,即僅分配足夠的內存(在這些常見情況下可以節省內存),然后追加“獲取一個” ,我不會感到驚訝。上面介紹的“新塊”中添加了更多內容。
但是我不知道確切的細節-這只是動態數組的一般工作方式。將對python中列表的確切實現進行微調,以使其最適合典型的python程序。因此,我真正要說的是,您不能相信列表的大小來確切地告訴您其中包含多少-它可能包含額外的空間,并且額外的可用空間量很難判斷或預測。
ps的一種很好的替代選擇是將列表(value, pointer)成對,其中每個指針都指向下一個元組。這樣,盡管使用的總內存更高,但是您可以遞增地增加列表。那是一個鏈表(python使用的更像是向量或動態數組)。
[更新]請參閱Eli的出色答案。他/她解釋說,[]和[1]都被完全分配,但是追加到會[]分配額外的塊。代碼中的注釋就是我在上面所說的(這稱為“超額分配”,金額與我們所擁有的金額成比例,因此平均(“攤銷”)成本與規模成正比)。
添加回答
舉報