日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[cpyhon源代码]dict对象原理学习

發(fā)布時(shí)間:2024/4/13 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [cpyhon源代码]dict对象原理学习 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Cpython 2.7 分支中,dict 對(duì)象的源代碼?lookdict 搜索算法

?

1 static PyDictEntry * 2 lookdict(PyDictObject *mp, PyObject *key, register long hash) 3 { 4 register size_t i; 5 register size_t perturb; 6 register PyDictEntry *freeslot; 7 register size_t mask = (size_t)mp->ma_mask; 8 PyDictEntry *ep0 = mp->ma_table; 9 register PyDictEntry *ep; 10 register int cmp; 11 PyObject *startkey; 12 13 i = (size_t)hash & mask; 14 ep = &ep0[i]; 15 if (ep->me_key == NULL || ep->me_key == key) //【1】 16 return ep; 17 18 if (ep->me_key == dummy) 19 freeslot = ep; 20 else { 21 //進(jìn)到這里說明 ep->me-key !=NULL && ep->me_key!=key && ep->me_key==Active 22 if (ep->me_hash == hash) { 23 startkey = ep->me_key; 24 Py_INCREF(startkey); 25 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); //[2]這里為啥要再比較一次? 26 Py_DECREF(startkey); 27 if (cmp < 0) 28 return NULL; 29 if (ep0 == mp->ma_table && ep->me_key == startkey) {//[3]這里明顯是相等的,為啥要再判斷一次? 30 if (cmp > 0) 31 return ep; 32 } 33 else { 34 /* The compare did major nasty stuff to the 35 * dict: start over. 36 * XXX A clever adversary could prevent this 37 * XXX from terminating. 38 */ 39 return lookdict(mp, key, hash); 40 } 41 } 42 freeslot = NULL; 43 }

?

  

兩個(gè)問題無法理解:

  1.1?dict 對(duì)象搜索算法中,進(jìn)入【2】處已經(jīng)說明了?ep->me_key!=key 這個(gè)條件成立,但是 【2】那里為啥要再次比較一次?me_key 和 key 呢?

百思不得其解!!!

? ? ? 原因: 【1】處為兩個(gè)指針做 == 比較,說明指針的內(nèi)容相同,即指向的是同一對(duì)象

? ? ? ? ? ? ? ? ? 進(jìn)入到流程【2】則說明兩個(gè)對(duì)象指向不同的內(nèi)存,但是在滿足兩個(gè)條件后也認(rèn)為他們“相等”,從而返回對(duì)應(yīng)的項(xiàng)目,條件如下:

? ? ? ? ? ? ? ? ? 一是 兩個(gè)對(duì)象哈希值相等

? ? ? ? ? ? ? ? ? 二是 兩個(gè)對(duì)象的值相等(比較算法由對(duì)象提供,通常是 __eq__方法)

? ? ?舉例:dict[10000]=10,此時(shí)需要搜索 d[10000]對(duì)象的 entry 對(duì)象,搜索時(shí) 指向 10000 的Pyobject* 明顯和之前 存入 dict[10000] 值時(shí)對(duì)應(yīng)的

? ? ? ? ? ? ? ?Pyobject 指針不一致,此時(shí) p(p->int(10000) me_key) != q(q->int(10000) key),因此不會(huì)進(jìn)入流程 【1】

? ? ? ? ? ? ? ?但是 p,q同時(shí)滿足規(guī)定的兩個(gè)條件,即hash值和 ob_val 都一致,因此返回 p 處的 (key,value)entry

? ?

? ? ?1.2 [3]處 判斷的條件明顯是成立的(參見藍(lán)色高亮部分),不理解為啥要重復(fù)判斷一次,暫時(shí)想不通~

? ? ?

轉(zhuǎn)載于:https://www.cnblogs.com/muyiblog/p/9387747.html

總結(jié)

以上是生活随笔為你收集整理的[cpyhon源代码]dict对象原理学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。