python中list的實現

2021-10-21 02:17:28 字數 1056 閱讀 1055

首先,我們需要知道的是,python中一切皆物件。也就是說我們的字串是乙個物件,我們的list也是乙個物件,而他們也是由元類來建立。

>>

> a =

>>

> a.__class__

<

class

'list'

>

>>

> a.__class__.__class__

<

class

'type'

>

再說說記憶體,我們知道,儲存的最小單位為位元組,乙個位元組又是由8位組成,記憶體就是由無數個位元組按照順序排列起來的。在python中,所有的值都與記憶體打交道,例如正常的int型別或者在str型別,並且在32位機子中,乙個int型別的值在記憶體中是由4個位元組儲存的,即如果你存的是1,那麼在記憶體中,它的位即00000000 00000000 00000000 00000001,並且我們知道,字串是由乙個或多個字元組成的,乙個字元在記憶體中是由一位儲存的。

要知道,python中的list可以存放任意型別的資料,比如乙個整數,比如乙個新的字串和列表等。我們知道的乙個順序表它的存放方式是乙個一塊連續的記憶體空間,並且每塊記憶體空間都必須是相同的大小的記憶體單元,但是回去看我們的python,每乙個下標存放的值並不一定是相同型別的值,但我們還是可以通過下表去進行查詢,並且時間複雜度仍然是o(1)。這是為什麼?

因為,除了最基本的順序表,還有另一種分離式結構的順序表,這種表他將每個值單獨存放,而將存放值的位址在放在了順序表中(類似於鍊錶的操作)。這樣一來,不管你儲存的值是多大的型別的,只要你的記憶體空間能放下,他就會存在乙個id,而這個id就被記錄在了順序表相應的記憶體塊中。

接下來就是要知道,如何處理這個記憶體。都知道記憶體寶貴那python是如何來實現的呢?

在python的官方實現中,list實現採用如下的策略:建立空表(或很小的表)時,系統自動分配一塊能容納8個元素的儲存區;在執行插入操作時,如果元素儲存區滿就換一塊4倍大的儲存區。但如果此時的表已經很大(目前閾值為50000),則改變策略,採用加一倍的方式,引入這種改變策略的方式,是為了避免出現過多的空閒儲存位置。

python中利用list實現stack

class mystack def init self self.maxsize 5000 self.max 1 self.l1 def setmaxsize self,s if isinstance s,int false print your input is not a number elif...

python中改變list中list值的問題

l s 0,0,0 for i in range 3 l 1 1 1 print l 如上 定義乙個空list,新增元素也為list型別。本意是想改變list l中乙個值,使其結果為 0,0,0 0,1,0 0,0,0 但執行的結構下圖所示,將list l中的所有元素都改變了。為找到原因,檢視pyt...

Python中的List推導

list推導 list prehension 看它的英文名就夠煩人的了,我總無法記清 prehension的正確拼寫 為了防止我將這一優秀的特性也忘記,還是將它通俗的描述一下吧。官方教程中說list推導是一種建立list的簡潔方法,通常是乙個表示式跟著是乙個 for 的語句,然後是零個或多個 for...