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

Cpython 2.7 分支中,dict 对象的源代码 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 //进到这里说明 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     }

 

  

两个问题无法理解:

  1.1 dict 对象搜索算法中,进入【2】处已经说明了 ep->me_key!=key 这个条件成立,但是 【2】那里为啥要再次比较一次 me_key 和 key 呢?

百思不得其解!!!

      原因: 【1】处为两个指针做 == 比较,说明指针的内容相同,即指向的是同一对象

                  进入到流程【2】则说明两个对象指向不同的内存,但是在满足两个条件后也认为他们“相等”,从而返回对应的项目,条件如下:

                  一是 两个对象哈希值相等

                  二是 两个对象的值相等(比较算法由对象提供,通常是 __eq__方法)

     举例:dict[10000]=10,此时需要搜索 d[10000]对象的 entry 对象,搜索时 指向 10000 的Pyobject* 明显和之前 存入 dict[10000] 值时对应的

               Pyobject 指针不一致,此时 p(p->int(10000) me_key) != q(q->int(10000) key),因此不会进入流程 【1】

               但是 p,q同时满足规定的两个条件,即hash值和 ob_val 都一致,因此返回 p 处的 (key,value)entry

   

     1.2 [3]处 判断的条件明显是成立的(参见蓝色高亮部分),不理解为啥要重复判断一次,暂时想不通~

     

转载于:https://www.cnblogs.com/muyiblog/p/9387747.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

熊猫数据集_熊猫迈向数据科学的第一步

熊猫数据集I started learning Data Science like everyone else by creating my first model using some machine learning technique. My first line of code was :通过使用某种机器学习技术创建我的第一个模型&#xff0c;我开始像其他所有人一样学习数据科学。 我的第一行代…

SQLServer锁的机制

SQLServer锁的机制&#xff1a;共享锁(S)排它锁(X)更新锁(U)意向共享 (IS)意向排它 (IX) 意向排它共享 (SIX)架构修改(Sch-M) 架构稳定性(Sch-S)大容量更新&#xff08;BU&#xff09;转载于:https://www.cnblogs.com/yldIndex/p/8603902.html

你是否具有价值

一个有价值的人往往受欢迎的程度才会高。白天上午花了两个多小时的时间帮前同事远程解决了服务器部署时由于防火墙机制问题引起的系统功能失败的问题。解决完这个问题之后&#xff0c;同事的心情很愉悦&#xff0c;其实我自己的心情也很愉悦&#xff0c;看来人都有帮助别人和被…

为什么选择做班级管理系统_为什么即使在平衡的班级下准确性也很麻烦

为什么选择做班级管理系统Accuracy is a go-to metric because it’s highly interpretable and low-cost to evaluate. For this reason, accuracy — perhaps the most simple of machine learning metrics — is (rightfully) commonplace. However, it’s also true that m…

使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等)

使用Chrome开发者工具调试Android端内网页(微信&#xff0c;QQ&#xff0c;UC&#xff0c;App内嵌页等) 传送门转载于:https://www.cnblogs.com/momozjm/p/9389912.html

517. 超级洗衣机

517. 超级洗衣机 假设有 n 台超级洗衣机放在同一排上。开始的时候&#xff0c;每台洗衣机内可能有一定量的衣服&#xff0c;也可能是空的。 在每一步操作中&#xff0c;你可以选择任意 m (1 < m < n) 台洗衣机&#xff0c;与此同时将每台洗衣机的一件衣服送到相邻的一台…

netflix的准实验面临的主要挑战

重点 (Top highlight)Kamer Toker-Yildiz, Colin McFarland, Julia GlickKAMER Toker-耶尔德兹 &#xff0c; 科林麦克法兰 &#xff0c; Julia格里克 At Netflix, when we can’t run A/B experiments we run quasi experiments! We run quasi experiments with various obje…

网站漏洞检测针对区块链网站安全分析

2019独角兽企业重金招聘Python工程师标准>>> 目前移动互联网中&#xff0c;区块链的网站越来越多&#xff0c;在区块链安全上&#xff0c;很多都存在着网站漏洞&#xff0c;区块链的充值&#xff0c;会员账号的存储性XSS窃取漏洞&#xff0c;账号安全&#xff0c;等…

223. 矩形面积

223. 矩形面积 给你 二维 平面上两个 由直线构成的 矩形&#xff0c;请你计算并返回两个矩形覆盖的总面积。 每个矩形由其 左下 顶点和 右上 顶点坐标表示&#xff1a; 第一个矩形由其左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2) 定义。 第二个矩形由其左下顶点 (bx1, by1) …

微观计量经济学_微观经济学与数据科学

微观计量经济学什么是经济学和微观经济学&#xff1f; (What are Economics and Microeconomics?) Economics is a social science concerned with the production, distribution, and consumption of goods and services. It studies how individuals, businesses, governmen…

NPM 重新回炉

官方教程传送门( 英文 ) 本文主要是官方文章的精炼,适合想了解一些常用操作的同学们 NPM 是 基于node的一个包管理工具 , 安装node环境时会自带安装NPM. NPM版本管理 查看现有版本 npm -v 安装最新的稳定版本 npm install npmlatest -g 安装最新的测试版本 npm install npmn…

1436. 旅行终点站

1436. 旅行终点站 给你一份旅游线路图&#xff0c;该线路图中的旅行线路用数组 paths 表示&#xff0c;其中 paths[i] [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi 。请你找出这次旅行的终点站&#xff0c;即没有任何可以通往其他城市的线路的城市。 题目数据…

如何使用fio模拟线上环境

线上表现 这里我想通过fio来模拟线上的IO场景&#xff0c;那么如何模拟呢&#xff1f; 首先使用iostat看线上某个盘的 使用情况&#xff0c;这里我们需要关注的是 avgrq-sz, avgrq-qz. #iostat -dx 1 1000 /dev/sdk Device: rrqm/s wrqm/s r/s w/s rkB/s …

熊猫数据集_熊猫迈向数据科学的第二部分

熊猫数据集If you haven’t read the first article then it is advised that you go through that before continuing with this article. You can find that article here. So far we have learned how to access data in different ways. Now we will learn how to analyze …

Python基础综合练习

Pycharm开发环境设置与熟悉。 练习基本输入输出&#xff1a; print(你好,{}..format(name)) print(sys.argv) 库的使用方法&#xff1a; import ... from ... import ... 条件语句&#xff1a; if (abs(pos()))<1: break 循环语句&#xff1a; for i in range(5): while Tru…

POJ 3608 旋转卡壳

思路&#xff1a; 旋转卡壳应用 注意点&边 边&边 点&点 三种情况 //By SiriusRen #include <cmath> #include <cstdio> #include <algorithm> using namespace std; const double eps1e-5; const int N10050; typedef double db; int n,m; str…

405. 数字转换为十六进制数

405. 数字转换为十六进制数 给定一个整数&#xff0c;编写一个算法将这个数转换为十六进制数。对于负整数&#xff0c;我们通常使用 补码运算 方法。 注意: 十六进制中所有字母(a-f)都必须是小写。 十六进制字符串中不能包含多余的前导零。如果要转化的数为0&#xff0c;那么…

为什么我要重新开始数据科学

I’m feeling stuck.我感觉卡住了。 In my current work and in the content I create (videos and blog posts), I feel like I’ve begun to stall out. Most of the consumers of my content are at the start of their data science journey. The longer I’m in the fiel…

蓝牙协议 HFP,HSP,A2DP,A2DP_CT,A2DP_TG,AVRCP,OPP,PBAP,SPP,FTP,TP,DTMF,DUN,SDP

简介&#xff1a; HSP&#xff08;手机规格&#xff09;– 提供手机&#xff08;移动电话&#xff09;与耳机之间通信所需的基本功能。 HFP&#xff08;免提规格&#xff09;– 在 HSP 的基础上增加了某些扩展功能&#xff0c;原来只用于从固定车载免提装置来控制移动电话。 A2…

482. 密钥格式化

482. 密钥格式化 有一个密钥字符串 S &#xff0c;只包含字母&#xff0c;数字以及 ‘-’&#xff08;破折号&#xff09;。其中&#xff0c; N 个 ‘-’ 将字符串分成了 N1 组。 给你一个数字 K&#xff0c;请你重新格式化字符串&#xff0c;使每个分组恰好包含 K 个字符。特…