




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第Python虛擬機中列表的實現(xiàn)原理是什么items=self-ob_item;
//從后往前進(jìn)行元素的拷貝操作,也就是將插入位置及其之后的元素往后移動一個位置
for(i=n;--i=where;)
items[i+1]=items[i];
//因為鏈表應(yīng)用的對象,因此對象的referencecount需要進(jìn)行加一操作
Py_INCREF(v);
//在列表當(dāng)中保存對象v
items[where]=v;
return0;
}
列表的刪除函數(shù)remove
對于數(shù)組ob_item來說,刪除一個元素就需要將這個元素后面的元素往前移動,因此整個過程如下所示:
staticPyObject*
listremove(PyListObject*self,PyObject*v)
Py_ssize_ti;
//編譯數(shù)組ob_item查找和對象v相等的元素并且將其刪除
for(i=0;iPy_SIZE(self);i++){
intcmp=PyObject_RichCompareBool(self-ob_item[i],v,Py_EQ);
if(cmp0){
if(list_ass_slice(self,i,i+1,
(PyObject*)NULL)==0)
Py_RETURN_NONE;
returnNULL;
elseif(cmp0)
returnNULL;
//如果沒有找到這個元素就進(jìn)行報錯處理在下面有一個例子重新編譯python解釋器將這個錯誤內(nèi)容修改的例子
PyErr_SetString(PyExc_ValueError,list.remove(x):xnotinlist
returnNULL;
}
執(zhí)行的python程序內(nèi)容為:
data=[]
data.remove(1)
下面是整個修改內(nèi)容和報錯結(jié)果:
從上面的結(jié)果我們可以看到的是,我們修改的錯誤信息正確打印了出來。
列表的統(tǒng)計函數(shù)count
這個函數(shù)的主要作用就是統(tǒng)計列表self當(dāng)中有多少個元素和v相等。
staticPyObject*
listcount(PyListObject*self,PyObject*v)
Py_ssize_tcount=0;
Py_ssize_ti;
for(i=0;iPy_SIZE(self);i++){
intcmp=PyObject_RichCompareBool(self-ob_item[i],v,Py_EQ);
//如果相等則將count進(jìn)行加一操作
if(cmp0)
count++;
//如果出現(xiàn)錯誤就返回NULL
elseif(cmp0)
returnNULL;
//將一個Py_ssize_t的變量變成python當(dāng)中的對象
returnPyLong_FromSsize_t(count);
}
列表的拷貝函數(shù)copy
這是列表的淺拷貝函數(shù),它只拷貝了真實python對象的指針,并沒有拷貝真實的python對象,從下面的代碼可以知道列表的拷貝是淺拷貝,當(dāng)b對列表當(dāng)中的元素進(jìn)行修改時,列表a當(dāng)中的元素也改變了。如果需要進(jìn)行深拷貝可以使用copy模塊當(dāng)中的deepcopy函數(shù)。
a=[1,2,[3,4]]
b=a.copy()
b[2][1]=5
[1,2,[3,5]]
copy函數(shù)對應(yīng)的源代碼(listcopy)如下所示:
staticPyObject*
listcopy(PyListObject*self)
returnlist_slice(self,0,Py_SIZE(self));
staticPyObject*
list_slice(PyListObject*a,Py_ssize_tilow,Py_ssize_tihigh)
//Py_SIZE(a)返回列表a當(dāng)中元素的個數(shù)(注意不是數(shù)組的長度allocated)
PyListObject*np;
PyObject**src,**dest;
Py_ssize_ti,len;
if(ilow0)
ilow=0;
elseif(ilowPy_SIZE(a))
ilow=Py_SIZE(a);
if(ihighilow)
ihigh=ilow;
elseif(ihighPy_SIZE(a))
ihigh=Py_SIZE(a);
len=ihigh-ilow;
np=(PyListObject*)PyList_New(len);
if(np==NULL)
returnNULL;
src=a-ob_item+ilow;
dest=np-ob_item;
//可以看到這里循環(huán)拷貝的是指向真實python對象的指針并不是真實的對象
for(i=0;ilen;i++){
PyObject*v=src[i];
//同樣的因為并沒有創(chuàng)建新的對象,但是這個對象被新的列表使用到啦因此他的referencecount需要進(jìn)行加一操作Py_INCREF(v)的作用:將對象v的referencecount加一
Py_INCREF(v);
dest[i]=v;
return(PyObject*)np;
}
下圖就是使用a.copy()淺拷貝的時候,內(nèi)存的布局的示意圖,可以看到列表指向的對象數(shù)組發(fā)生了變化,但是數(shù)組中元素指向的python對象并沒有發(fā)生變化。
下面是對列表對象進(jìn)行深拷貝的時候內(nèi)存的大致示意圖,可以看到數(shù)組指向的python對象也是不一樣的。
列表的清空函數(shù)clear
當(dāng)我們在使用list.clear()的時候會調(diào)用下面這個函數(shù)。清空列表需要注意的就是將表示列表當(dāng)中元素個數(shù)的ob_size字段設(shè)置成0,同時將列表當(dāng)中所有的對象的referencecount設(shè)置進(jìn)行-1操作,這個操作是通過宏P(guān)y_XDECREF實現(xiàn)的,這個宏還會做另外一件事就是如果這個對象的引用計數(shù)變成0了,那么就會直接釋放他的內(nèi)存。
staticPyObject*
listclear(PyListObject*self)
list_clear(self);
Py_RETURN_NONE;
staticint
list_clear(PyListObject*a)
Py_ssize_ti;
PyObject**item=a-ob_item;
if(item!=NULL){
/*BecauseXDECREFcanrecursivelyinvokeoperationson
thislist,wemakeitemptyfirst.*/
i=Py_SIZE(a);
Py_SIZE(a)=0;
a-ob_item=NULL;
a-allocated=0;
while(--i=0){
Py_XDECREF(item[i]);
PyMem_FREE(item);
/*Neverfails;thereturnvaluecanbeignored.
Notethatthereisnoguaranteethatthelistisactuallyempty
atthispoint,becauseXDECREFmayhavepopulateditagain!*/
return0;
}
列表反轉(zhuǎn)函數(shù)reverse
在python當(dāng)中如果我們想要反轉(zhuǎn)類表當(dāng)中的內(nèi)容的話,就會使用這個函數(shù)reverse。
a=[iforiinrange(10)]
a.reverse()
[9,8,7,6,5,4,3,2,1,0]
其對應(yīng)的源程序如下所示:
staticPyObject*
listreverse(PyListObject*self)
if(Py_SIZE(self)1)
reverse_slice(self-ob_item,self-ob_item+Py_SIZE(self));
Py_RETURN_NONE;
staticvoid
reverse_slice(PyObject**lo,PyObj
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 以技術(shù)引領(lǐng)創(chuàng)新推動制造業(yè)數(shù)字化和智能化升級的實踐研究
- 醫(yī)療科技的創(chuàng)新與發(fā)展個性化健康A(chǔ)PP的設(shè)計與實施
- 醫(yī)療大數(shù)據(jù)庫建設(shè)中的隱私問題和知識產(chǎn)權(quán)管理策略研究報告
- 區(qū)塊鏈技術(shù)推動零售業(yè)融資模式創(chuàng)新
- 2025年《義務(wù)教育數(shù)學(xué)課程標(biāo)準(zhǔn)(2025年版)》學(xué)習(xí)心得體會模版
- 住房空間設(shè)計合同范例
- 區(qū)塊鏈技術(shù)在商業(yè)領(lǐng)域的原理與實戰(zhàn)策略
- 醫(yī)療設(shè)備質(zhì)量監(jiān)管的法規(guī)與政策分析
- 醫(yī)療AI在慢性病管理中的輔助決策作用
- 辦公自動化中如何利用區(qū)塊鏈技術(shù)實現(xiàn)高效的數(shù)據(jù)管理與協(xié)作
- 《西游記》講解學(xué)習(xí)
- 2024年校園食品安全檢測服務(wù)協(xié)議3篇
- 江蘇省蘇州市(2024年-2025年小學(xué)六年級語文)部編版小升初真題(下學(xué)期)試卷及答案
- 乳酸性酸中毒護理
- 部編版小學(xué)語文四年級下冊教師教學(xué)用書
- DB36T 540-2017 汽車維修連鎖經(jīng)營服務(wù)規(guī)范
- 《海航集團案例》課件
- 電力系統(tǒng)繼電保護課后習(xí)題解析(第二版)-張保會-尹項根主編
- 《尊師重道主題班會》課件
- 體育講座培訓(xùn)課件
- GB/T 42151.3-2024電力自動化通信網(wǎng)絡(luò)和系統(tǒng)第3部分:通用要求
評論
0/150
提交評論