Python虛擬機中列表的實現(xiàn)原理是什么_第1頁
Python虛擬機中列表的實現(xiàn)原理是什么_第2頁
Python虛擬機中列表的實現(xiàn)原理是什么_第3頁
Python虛擬機中列表的實現(xiàn)原理是什么_第4頁
Python虛擬機中列表的實現(xiàn)原理是什么_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論