python 源码解析(一)

为了看懂 python 源码 ,特地学了 c++ ,依然看不懂,看了个大概,先留个坑,慢慢填。

先从 python dict 对象开始看起。

python dict 对象  是键值对的 一种结构,类似于 java 的hashmap 对象。

dictd 对象 , 每个键值对 ,被 c 的 struct 结构定义,两个指针,一个指向key ,另一个 指向value.

typedef struct {
	long me_hash;
	PyObject *me_key;
	PyObject *me_value;
#ifdef USE_CACHE_ALIGNED
	long	aligner;
#endif
} dictentry

而 定义字典得 struct 是这样的。

struct dictobject {
	PyObject_HEAD
	int ma_fill;
	int ma_used;
	int ma_size;
	int ma_poly;
	dictentry *ma_table;
	dictentry *(*ma_lookup)(dictobject *mp, PyObject *key, long hash);
};

dictentry *ma_table;  是一个 dictentry 的 指针。

而  字典 是 采用开放寻址法,dict 创建过程,mp->ma_size = 0;
    mp->ma_poly = 0;
    mp->ma_table = NULL;
    mp->ma_fill = 0;
    mp->ma_used = 0;

分别用 ma_size  ma_table  等几个 字段 记录状态。这是 ma_table 为 null , 表明 字典 里还没有键值对。

yDict_New(void)
{
	register dictobject *mp;
	if (dummy == NULL) { /* Auto-initialize dummy */
		dummy = PyString_FromString("<dummy key>");
		if (dummy == NULL)
			return NULL;
#ifdef SHOW_CONVERSION_COUNTS
		Py_AtExit(show_counts);
#endif
	}
	mp = PyObject_NEW(dictobject, &PyDict_Type);
	if (mp == NULL)
		return NULL;
	mp->ma_size = 0;
	mp->ma_poly = 0;
	mp->ma_table = NULL;
	mp->ma_fill = 0;
	mp->ma_used = 0;
	mp->ma_lookup = lookdict_string;
#ifdef SHOW_CONVERSION_COUNTS
	++created;
#endif
	PyObject_GC_Init(mp);
	return (PyObject *)mp;
}

太晚了 头晕 ,明天再说。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值