python list 初始化初始化应该如何定义 请大神指教

先来看它的定义
typedef struct _dictobject PyDictO
struct _dictobject {
PyObject_HEAD
Py_ssize_t ma_
/* # Active + # Dummy */
Py_ssize_t ma_
/* # Active */
/* The table contains ma_mask + 1 slots, and that's a power of 2.
* We store the mask instead of the size because the mask is more
* frequently needed.
Py_ssize_t ma_
/* ma_table points to ma_smalltable for small tables, else to
* additional malloc'ed memory.
ma_table is never NULL!
* saves repeated runtime null-tests in the workhorse getitem and
* setitem calls.
PyDictEntry *ma_
PyDictEntry *(*ma_lookup)(PyDictObject *mp, PyObject *key, Py_hash_t hash);
PyDictEntry ma_smalltable[PyDict_MINSIZE];
在PyObject *PyDict_New(void)中,调用了宏定义EMPTY_TO_MINSIZE
#define INIT_NONZERO_DICT_SLOTS(mp) do {
(mp)-&ma_table = (mp)-&ma_
(mp)-&ma_mask = PyDict_MINSIZE - 1;
} while(0)
#define EMPTY_TO_MINSIZE(mp) do {
memset((mp)-&ma_smalltable, 0, sizeof((mp)-&ma_smalltable));
(mp)-&ma_used = (mp)-&ma_fill = 0;
INIT_NONZERO_DICT_SLOTS(mp);
} while(0)
可以看出ma_table开始是指向ma_smalltable的,这和代码的注释一致
mp-&ma_lookup = lookdict_ 给函数指针赋值,dict的搜索函数
随着int PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)的不断调用
该函数会在最后判断
if (!(mp-&ma_used & n_used && mp-&ma_fill*3 &= (mp-&ma_mask+1)*2))
return dictresize(mp, (mp-&ma_used & 50000 ? 2 : 4) * mp-&ma_used);
可见在ma_fill = 6 && ma_mask=7 的时候,走到了dictresize
会重新申请新的内存, ma_table就不再指向ma_smalltable, 而是新的内存,
然后把原来老的内容拷贝到新的内存里面.by calling insertdict_clean
之后 ma_fill = ma_used = 6, ma_mask = 31
/* Get space for a new table. */
oldtable = mp-&ma_
assert(oldtable != NULL);
is_oldtable_malloced = oldtable != mp-&ma_
if (is_oldtable_malloced)
PyMem_DEL(oldtable);
最后看老的内存是否应该释放
如果老的是ma_smalltable, 就不管了
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:58169次
积分:1364
积分:1364
排名:第13115名
原创:81篇
(8)(3)(1)(1)(1)(4)(3)(8)(4)(3)(13)(1)(3)(1)(2)(1)(1)(11)(13)(1)手机扫描二维码,把小组装进口袋
第三方登录:python数组要先定义长度吗_百度知道
python数组要先定义长度吗
提问者采纳
视情况定数组追加元素用定义度初始化列表要修改其值要定义度 举例吧a = []for i in range(10):
a.append(i)print ab = [0 for i in range(10)]
#b = [0]*10 for i in range(10):
b[i]=iprint b
提问者评价
3q 可惜我没分 有了再补
其他类似问题
python的相关知识
按默认排序
其他1条回答
需要python特点
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 python set初始化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信