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;
}

太晚了 头晕 ,明天再说。

猜你喜欢

转载自blog.csdn.net/qq_40394962/article/details/84799636