为了看懂 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;
}
太晚了 头晕 ,明天再说。