




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第Python虛擬機中列表的實現(xiàn)原理是什么items=self-ob_item;
//從后往前進行元素的拷貝操作,也就是將插入位置及其之后的元素往后移動一個位置
for(i=n;--i=where;)
items[i+1]=items[i];
//因為鏈表應用的對象,因此對象的referencecount需要進行加一操作
Py_INCREF(v);
//在列表當中保存對象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;
//如果沒有找到這個元素就進行報錯處理在下面有一個例子重新編譯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當中有多少個元素和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進行加一操作
if(cmp0)
count++;
//如果出現(xiàn)錯誤就返回NULL
elseif(cmp0)
returnNULL;
//將一個Py_ssize_t的變量變成python當中的對象
returnPyLong_FromSsize_t(count);
}
列表的拷貝函數(shù)copy
這是列表的淺拷貝函數(shù),它只拷貝了真實python對象的指針,并沒有拷貝真實的python對象,從下面的代碼可以知道列表的拷貝是淺拷貝,當b對列表當中的元素進行修改時,列表a當中的元素也改變了。如果需要進行深拷貝可以使用copy模塊當中的deepcopy函數(shù)。
a=[1,2,[3,4]]
b=a.copy()
b[2][1]=5
[1,2,[3,5]]
copy函數(shù)對應的源代碼(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當中元素的個數(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需要進行加一操作Py_INCREF(v)的作用:將對象v的referencecount加一
Py_INCREF(v);
dest[i]=v;
return(PyObject*)np;
}
下圖就是使用a.copy()淺拷貝的時候,內(nèi)存的布局的示意圖,可以看到列表指向的對象數(shù)組發(fā)生了變化,但是數(shù)組中元素指向的python對象并沒有發(fā)生變化。
下面是對列表對象進行深拷貝的時候內(nèi)存的大致示意圖,可以看到數(shù)組指向的python對象也是不一樣的。
列表的清空函數(shù)clear
當我們在使用list.clear()的時候會調(diào)用下面這個函數(shù)。清空列表需要注意的就是將表示列表當中元素個數(shù)的ob_size字段設置成0,同時將列表當中所有的對象的referencecount設置進行-1操作,這個操作是通過宏Py_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當中如果我們想要反轉(zhuǎn)類表當中的內(nèi)容的話,就會使用這個函數(shù)reverse。
a=[iforiinrange(10)]
a.reverse()
[9,8,7,6,5,4,3,2,1,0]
其對應的源程序如下所示:
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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國電子郵件簽名軟件行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國電動鎖具行業(yè)市場深度分析及競爭格局與投資前景報告
- 2025至2030中國瑜伽短褲行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 2025至2030中國特級面粉行業(yè)市場深度研究與戰(zhàn)略咨詢分析報告
- 學習動機的強化策略教育心理學的視角
- 智能教育未來展望組委會的角色與影響
- 2025秋季教務處工作計劃:打造8大體系 培育時代新人
- 數(shù)字化教育資源的建設與共享
- 抖音商戶短視頻拍攝流程標準化規(guī)定
- 抖音商戶數(shù)據(jù)分析師用戶分層運營制度
- 小酒館合伙人合作協(xié)議書
- 電玩城入股合同范本
- 2025-2030中國搜索引擎行業(yè)現(xiàn)狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報告
- 驛站合伙承包協(xié)議書
- 2025年社會工作專業(yè)資格考試試題及答案
- 拖欠房租分期協(xié)議書
- 藍莓鮮果采購合同協(xié)議
- 人事行政部2025年部門工作總結(jié)模版
- 方劑歌訣(廣中醫(yī)版)
- 商鋪租賃補充協(xié)議范本
- 新疆維吾爾自治區(qū)2024年普通高校招生單列類(選考外語)本科一批次投檔情況(文史)
評論
0/150
提交評論