原文鏈接
目前成都創(chuàng)新互聯(lián)公司已為超過千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、阿城網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
這篇文章介紹了Python中l(wèi)ist是如何實(shí)現(xiàn)的。
在Python中l(wèi)ist特別有用。讓我們來看下list的內(nèi)部是如何實(shí)現(xiàn)的。
來看下面簡(jiǎn)單的程序,在list中添加一些整數(shù)并將他們打印出來。
正如你所看到的,list是可以迭代的。
Python中l(wèi)ist是用下邊的C語(yǔ)言的結(jié)構(gòu)來表示的。 ob_item 是用來保存元素的指針數(shù)組,allocated是 ob_item 預(yù)先分配的內(nèi)存總?cè)萘?/p>
讓我們來看下當(dāng)初始化一個(gè)空l(shuí)ist的時(shí)候發(fā)生了什么 L = []
非常重要的是知道list申請(qǐng)內(nèi)存空間的大小(后文用allocated代替)的大小和list實(shí)際存儲(chǔ)元素所占空間的大小( ob_size )之間的關(guān)系, ob_size 的大小和 len(L) 是一樣的,而allocated的大小是在內(nèi)存中已經(jīng)申請(qǐng)空間大小。通常你會(huì)看到allocated的值要比 ob_size 的值要大。這是為了避免每次有新元素加入list時(shí)都要調(diào)用realloc進(jìn)行內(nèi)存分配。接下來我們會(huì)看到更多關(guān)于這些的內(nèi)容。
我們?cè)趌ist中追加一個(gè)整數(shù):L.append(1)。發(fā)生了什么?調(diào)用了內(nèi)部的C函數(shù)app1()
來讓我們看下 list_resize() , list_resize() 會(huì)申請(qǐng)多余的空間以避免調(diào)用多次 list_resize() 函數(shù),list增長(zhǎng)的模型是:0, 4, 8, 16, 25, 35, 46, 58, 72, 88, …
開辟了四個(gè)內(nèi)存空間來存放list中的元素,存放的第一個(gè)元素是1。你可以從下圖中看到L[0]指向了我們剛剛加進(jìn)去的元素。虛線的框代表了申請(qǐng)了但是還沒有使用(存儲(chǔ)元素)的內(nèi)存空間
現(xiàn)在我們?cè)诹斜淼牡谝粋€(gè)位置插入一個(gè)整數(shù)5:L.insert(1, 5),看看內(nèi)部發(fā)生了什么。調(diào)用了ins1()
當(dāng)你彈出list的最后一個(gè)元素:L.pop()。調(diào)用listpop(), list_resize 在函數(shù)listpop()內(nèi)部被調(diào)用,如果這時(shí) ob_size (譯者注:彈出元素后)小于allocated(譯者注:已經(jīng)申請(qǐng)的內(nèi)存空間)的一半。這時(shí)申請(qǐng)的內(nèi)存空間將會(huì)縮小。
Pop的時(shí)間復(fù)雜度是O(1)
Python list對(duì)象有一個(gè)方法可以移除一個(gè)指定的元素。調(diào)用listremove()。
切開list和刪除元素,調(diào)用了 list_ass_slice() (譯者注:在上文slice list between element's slot and element's slot + 1被調(diào)用),來看下 list_ass_slice() 是如何工作的。在這里,低位為1 高位為2(譯者注:傳入的參數(shù)),我們移除在1號(hào)內(nèi)存空間存儲(chǔ)的數(shù)據(jù)5
Remove的時(shí)間復(fù)雜度為O(n)
文中l(wèi)ist的sort部分沒有進(jìn)行翻譯
核心部分
list是一個(gè)函數(shù),將參數(shù)強(qiáng)制轉(zhuǎn)換成列表
list((1,4,7)) 對(duì)元組(1,4,7)使用list函數(shù)就返回列表[1,4,7]
map(list,zip(*a))表示對(duì)zip(*a)的每一個(gè)單位都執(zhí)行l(wèi)ist函數(shù)
而且這在python 2.6.6中執(zhí)行正常,執(zhí)行效果如下
a=[[1,2,3],[4,5,6],[7,8,9]]
zip(*a)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
map(list,zip(*a))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
轉(zhuǎn)自
Python? range() 函數(shù)返回的是一個(gè)可迭代對(duì)象(類型是對(duì)象),而不是列表類型, 所以打印的時(shí)候不會(huì)打印列表。
函數(shù)語(yǔ)法:
range(stop)range(start,stop,step)//默認(rèn)start為0,step為1
Python? list() 函數(shù)是對(duì)象迭代器,可以把range()返回的可迭代對(duì)象轉(zhuǎn)為一個(gè)列表,返回的變量類型為列表。
list() 方法用于將元組轉(zhuǎn)換為列表。
注: 元組與列表是非常類似的,區(qū)別在于元組的元素值不能修改,元組是放在括號(hào)中( ),列表是放于方括號(hào)中[ ]。
元組中只包含一個(gè)元素時(shí),需要在元素后面添加逗號(hào)
tup1=(50,)
list、元組與字符串的索引一樣,列表索引從0開始。列表可以進(jìn)行截取、組合等。