Python源码:字典
一、创建增加修改
1、实现代码
- #创建
- stu_info = { "xiedi":28, "liuhailin":27,"daiqiao":30,"hanwenhai":25,"chenqun":38}
- print(stu_info)
- #增加
- stu_info["luoahong"]=32
- print(stu_info)
- #修改
- stu_info["xiedi"]=29
- print(stu_info)
输出结果
- {'xiedi': 28, 'liuhailin': 27, 'daiqiao': 30, 'hanwenhai': 25, 'chenqun': 38}
- {'xiedi': 28, 'liuhailin': 27, 'daiqiao': 30, 'hanwenhai': 25, 'chenqun': 38, 'luoahong': 32}
- {'xiedi': 29, 'liuhailin': 27, 'daiqiao': 30, 'hanwenhai': 25, 'chenqun': 38, 'luoahong': 32}
二、删除(del)
1、实现代码
- del stu_info["chenqun"]
- print(stu_info)
2、输出结果
- {'xiedi': 29, 'liuhailin': 27, 'daiqiao': 30, 'hanwenhai': 25, 'luoahong': 32}
1、Dict_DelItem
- int
- PyDict_DelItem(PyObject *op, PyObject *key)
- {
- Py_hash_t hash;
- assert(key);
- if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyASCIIObject *) key)->hash) == -1) {
- hash = PyObject_Hash(key);
- if (hash == -1)
- return -1;
- }
- return _PyDict_DelItem_KnownHash(op, key, hash);
- }
2、Dict_DelItem_KnownHash
- int
- _PyDict_DelItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
- {
- Py_ssize_t ix;
- PyDictObject *mp;
- PyObject *old_value;
- if (!PyDict_Check(op)) {
- PyErr_BadInternalCall();
- return -1;
- }
- assert(key);
- assert(hash != -1);
- mp = (PyDictObject *)op;
- ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &old_value);
- if (ix == DKIX_ERROR)
- return -1;
- if (ix == DKIX_EMPTY || old_value == NULL) {
- _PyErr_SetKeyError(key);
- return -1;
- }
- // Split table doesn't allow deletion. Combine it.
- if (_PyDict_HasSplitTable(mp)) {
- if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
- return -1;
- }
- ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &old_value);
- assert(ix >= 0);
- }
- return delitem_common(mp, hash, ix, old_value);
- }
- /* This function promises that the predicate -> deletion sequence is atomic
- * (i.e. protected by the GIL), assuming the predicate itself doesn't
- * release the GIL.
- */
3、PyDict_DelItemIf
- int
- _PyDict_DelItemIf(PyObject *op, PyObject *key,
- int (*predicate)(PyObject *value))
- {
- Py_ssize_t hashpos, ix;
- PyDictObject *mp;
- Py_hash_t hash;
- PyObject *old_value;
- int res;
- if (!PyDict_Check(op)) {
- PyErr_BadInternalCall();
- return -1;
- }
- assert(key);
- hash = PyObject_Hash(key);
- if (hash == -1)
- return -1;
- mp = (PyDictObject *)op;
- ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &old_value);
- if (ix == DKIX_ERROR)
- return -1;
- if (ix == DKIX_EMPTY || old_value == NULL) {
- _PyErr_SetKeyError(key);
- return -1;
- }
- // Split table doesn't allow deletion. Combine it.
- if (_PyDict_HasSplitTable(mp)) {
- if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
- return -1;
- }
- ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &old_value);
- assert(ix >= 0);
- }
- res = predicate(old_value);
- if (res == -1)
- return -1;
- hashpos = lookdict_index(mp->ma_keys, hash, ix);
- assert(hashpos >= 0);
- if (res > 0)
- return delitem_common(mp, hashpos, ix, old_value);
- else
- return 0;
- }
二、删除pop(k)
实现
- stu_info = { "xiedi":28, "liuhailin":27,"daiqiao":30,"hanwenhai":25,"chenqun":38}
- print(stu_info)
- stu_info.pop("liuhailin")
- print(stu_info)
输出结果:
- {'xiedi': 28, 'liuhailin': 27, 'daiqiao': 30, 'hanwenhai': 25, 'chenqun': 38}
- {'xiedi': 28, 'daiqiao': 30, 'hanwenhai': 25, 'chenqun': 38}
1、_PyDict_Pop
- PyObject *
- _PyDict_Pop(PyObject *dict, PyObject *key, PyObject *deflt)
- {
- Py_hash_t hash;
- if (((PyDictObject *)dict)->ma_used == 0) {
- if (deflt) {
- Py_INCREF(deflt);
- return deflt;
- }
- _PyErr_SetKeyError(key);
- return NULL;
- }
- if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyASCIIObject *) key)->hash) == -1) {
- hash = PyObject_Hash(key);
- if (hash == -1)
- return NULL;
- }
- return _PyDict_Pop_KnownHash(dict, key, hash, deflt);
- }
2、_PyDict_Pop_KnownHash
- /* Internal version of dict.pop(). */
- PyObject *
- _PyDict_Pop_KnownHash(PyObject *dict, PyObject *key, Py_hash_t hash, PyObject *deflt)
- {
- Py_ssize_t ix, hashpos;
- PyObject *old_value, *old_key;
- PyDictKeyEntry *ep;
- PyDictObject *mp;
- assert(PyDict_Check(dict));
- mp = (PyDictObject *)dict;
- if (mp->ma_used == 0) {
- if (deflt) {
- Py_INCREF(deflt);
- return deflt;
- }
- _PyErr_SetKeyError(key);
- return NULL;
- }
- ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &old_value);
- if (ix == DKIX_ERROR)
- return NULL;
- if (ix == DKIX_EMPTY || old_value == NULL) {
- if (deflt) {
- Py_INCREF(deflt);
- return deflt;
- }
- _PyErr_SetKeyError(key);
- return NULL;
- }
- // Split table doesn't allow deletion. Combine it.
- if (_PyDict_HasSplitTable(mp)) {
- if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
- return NULL;
- }
- ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &old_value);
- assert(ix >= 0);
- }
- hashpos = lookdict_index(mp->ma_keys, hash, ix);
- assert(hashpos >= 0);
- assert(old_value != NULL);
- mp->ma_used--;
- mp->ma_version_tag = DICT_NEXT_VERSION();
- dictkeys_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
- ep = &DK_ENTRIES(mp->ma_keys)[ix];
- ENSURE_ALLOWS_DELETIONS(mp);
- old_key = ep->me_key;
- ep->me_key = NULL;
- ep->me_value = NULL;
- Py_DECREF(old_key);
- ASSERT_CONSISTENT(mp);
- return old_value;
- }
三、随机删除一个元素popitem()
- stu_info = { "xiedi":28, "liuhailin":27,"daiqiao":30,"hanwenhai":25,"chenqun":38}
- print(stu_info)
- stu_info.popitem()
- print(stu_info)
输出结果:
- {'xiedi': 28, 'liuhailin': 27, 'daiqiao': 30, 'hanwenhai': 25, 'chenqun': 38}
- {'xiedi': 28, 'liuhailin': 27, 'daiqiao': 30, 'hanwenhai': 25}
1、dict_popitem_impl
- /*[clinic input]
- dict.popitem
- Remove and return a (key, value) pair as a 2-tuple.
- Pairs are returned in LIFO (last-in, first-out) order.
- Raises KeyError if the dict is empty.
- [clinic start generated code]*/
- static PyObject *
- dict_popitem_impl(PyDictObject *self)
- /*[clinic end generated code: output=e65fcb04420d230d input=1c38a49f21f64941]*/
- {
- Py_ssize_t i, j;
- PyDictKeyEntry *ep0, *ep;
- PyObject *res;
- /* Allocate the result tuple before checking the size. Believe it
- * or not, this allocation could trigger a garbage collection which
- * could empty the dict, so if we checked the size first and that
- * happened, the result would be an infinite loop (searching for an
- * entry that no longer exists). Note that the usual popitem()
- * idiom is "while d: k, v = d.popitem()". so needing to throw the
- * tuple away if the dict *is* empty isn't a significant
- * inefficiency -- possible, but unlikely in practice.
- */
- res = PyTuple_New(2);
- if (res == NULL)
- return NULL;
- if (self->ma_used == 0) {
- Py_DECREF(res);
- PyErr_SetString(PyExc_KeyError, "popitem(): dictionary is empty");
- return NULL;
- }
- /* Convert split table to combined table */
- if (self->ma_keys->dk_lookup == lookdict_split) {
- if (dictresize(self, DK_SIZE(self->ma_keys))) {
- Py_DECREF(res);
- return NULL;
- }
- }
- ENSURE_ALLOWS_DELETIONS(self);
- /* Pop last item */
- ep0 = DK_ENTRIES(self->ma_keys);
- i = self->ma_keys->dk_nentries - 1;
- while (i >= 0 && ep0[i].me_value == NULL) {
- i--;
- }
- assert(i >= 0);
- ep = &ep0[i];
- j = lookdict_index(self->ma_keys, ep->me_hash, i);
- assert(j >= 0);
- assert(dictkeys_get_index(self->ma_keys, j) == i);
- dictkeys_set_index(self->ma_keys, j, DKIX_DUMMY);
- PyTuple_SET_ITEM(res, 0, ep->me_key);
- PyTuple_SET_ITEM(res, 1, ep->me_value);
- ep->me_key = NULL;
- ep->me_value = NULL;
- /* We can't dk_usable++ since there is DKIX_DUMMY in indices */
- self->ma_keys->dk_nentries = i;
- self->ma_used--;
- self->ma_version_tag = DICT_NEXT_VERSION();
- ASSERT_CONSISTENT(self);
- return res;
- }
四、查找(key值在字典中存在)
1、dict_keys
- static PyObject *
- dict_keys(PyDictObject *mp)
- {
- PyObject *v;
- Py_ssize_t i, j;
- PyDictKeyEntry *ep;
- Py_ssize_t n, offset;
- PyObject **value_ptr;
- again:
- n = mp->ma_used;
- v = PyList_New(n);
- if (v == NULL)
- return NULL;
- if (n != mp->ma_used) {
- /* Durnit. The allocations caused the dict to resize.
- * Just start over, this shouldn't normally happen.
- */
- Py_DECREF(v);
- goto again;
- }
- ep = DK_ENTRIES(mp->ma_keys);
- if (mp->ma_values) {
- value_ptr = mp->ma_values;
- offset = sizeof(PyObject *);
- }
- else {
- value_ptr = &ep[0].me_value;
- offset = sizeof(PyDictKeyEntry);
- }
- for (i = 0, j = 0; j < n; i++) {
- if (*value_ptr != NULL) {
- PyObject *key = ep[i].me_key;
- Py_INCREF(key);
- PyList_SET_ITEM(v, j, key);
- j++;
- }
- value_ptr = (PyObject **)(((char *)value_ptr) + offset);
- }
- assert(j == n);
- return v;
- }
2、PyDict_Keys
- PyObject *
- PyDict_Keys(PyObject *mp)
- {
- if (mp == NULL || !PyDict_Check(mp)) {
- PyErr_BadInternalCall();
- return NULL;
- }
- return dict_keys((PyDictObject *)mp);
- }
- PyObject *
- PyDict_Values(PyObject *mp)
- {
- if (mp == NULL || !PyDict_Check(mp)) {
- PyErr_BadInternalCall();
- return NULL;
- }
- return dict_values((PyDictObject *)mp);
- }
五、get(k)
1、dict_get_impl
- static PyObject *
- dict_get_impl(PyDictObject *self, PyObject *key, PyObject *default_value)
- /*[clinic end generated code: output=bba707729dee05bf input=279ddb5790b6b107]*/
- {
- PyObject *val = NULL;
- Py_hash_t hash;
- Py_ssize_t ix;
- if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyASCIIObject *) key)->hash) == -1) {
- hash = PyObject_Hash(key);
- if (hash == -1)
- return NULL;
- }
- ix = (self->ma_keys->dk_lookup) (self, key, hash, &val);
- if (ix == DKIX_ERROR)
- return NULL;
- if (ix == DKIX_EMPTY || val == NULL) {
- val = default_value;
- }
- Py_INCREF(val);
- return val;
- }
2、_PyDict_GetItem_KnownHash
- /* Same as PyDict_GetItemWithError() but with hash supplied by caller.
- This returns NULL *with* an exception set if an exception occurred.
- It returns NULL *without* an exception set if the key wasn't present.
- */
- PyObject *
- _PyDict_GetItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
- {
- Py_ssize_t ix;
- PyDictObject *mp = (PyDictObject *)op;
- PyObject *value;
- if (!PyDict_Check(op)) {
- PyErr_BadInternalCall();
- return NULL;
- }
- ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value);
- if (ix < 0) {
- return NULL;
- }
- return value;
- }
3、_PyDict_GetItemId
- PyObject *
- _PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
- {
- PyObject *kv;
- kv = _PyUnicode_FromId(key); /* borrowed */
- if (kv == NULL) {
- PyErr_Clear();
- return NULL;
- }
- return PyDict_GetItem(dp, kv);
- }
- /* For backward compatibility with old dictionary interface */
4、PyDict_GetItemString
- PyObject *
- PyDict_GetItemString(PyObject *v, const char *key)
- {
- PyObject *kv, *rv;
- kv = PyUnicode_FromString(key);
- if (kv == NULL) {
- PyErr_Clear();
- return NULL;
- }
- rv = PyDict_GetItem(v, kv);
- Py_DECREF(kv);
- return rv;
- }
- int
- _PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
- {
- PyObject *kv;
- kv = _PyUnicode_FromId(key); /* borrowed */
- if (kv == NULL)
- return -1;
- return PyDict_SetItem(v, kv, item);
- }
- int
- PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
- {
- PyObject *kv;
- int err;
- kv = PyUnicode_FromString(key);
- if (kv == NULL)
- return -1;
- PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
- err = PyDict_SetItem(v, kv, item);
- Py_DECREF(kv);
- return err;
- }
六、setdefault(k,v)
setdefault()表示去取字典中的key,如果取不到,则设置新值,相反如果取到,则返回原有默认值
1、dict_setdefault_impl
- /*[clinic input]
- dict.setdefault
- key: object
- default: object = None
- /
- Insert key with a value of default if key is not in the dictionary.
- Return the value for key if key is in the dictionary, else default.
- [clinic start generated code]*/
- static PyObject *
- dict_setdefault_impl(PyDictObject *self, PyObject *key,
- PyObject *default_value)
- /*[clinic end generated code: output=f8c1101ebf69e220 input=0f063756e815fd9d]*/
- {
- PyObject *val;
- val = PyDict_SetDefault((PyObject *)self, key, default_value);
- Py_XINCREF(val);
- return val;
- }
- static PyObject *
- dict_clear(PyDictObject *mp, PyObject *Py_UNUSED(ignored))
- {
- PyDict_Clear((PyObject *)mp);
- Py_RETURN_NONE;
- }
- /*[clinic input]
- dict.pop
- key: object
- default: object = NULL
- /
2、PyDict_SetDefault
- PyObject *
- PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
- {
- PyDictObject *mp = (PyDictObject *)d;
- PyObject *value;
- Py_hash_t hash;
- if (!PyDict_Check(d)) {
- PyErr_BadInternalCall();
- return NULL;
- }
- if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyASCIIObject *) key)->hash) == -1) {
- hash = PyObject_Hash(key);
- if (hash == -1)
- return NULL;
- }
- if (mp->ma_keys == Py_EMPTY_KEYS) {
- if (insert_to_emptydict(mp, key, hash, defaultobj) < 0) {
- return NULL;
- }
- return defaultobj;
- }
- if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
- if (insertion_resize(mp) < 0)
- return NULL;
- }
- Py_ssize_t ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value);
- if (ix == DKIX_ERROR)
- return NULL;
- if (_PyDict_HasSplitTable(mp) &&
- ((ix >= 0 && value == NULL && mp->ma_used != ix) ||
- (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {
- if (insertion_resize(mp) < 0) {
- return NULL;
- }
- ix = DKIX_EMPTY;
- }
- if (ix == DKIX_EMPTY) {
- PyDictKeyEntry *ep, *ep0;
- value = defaultobj;
- if (mp->ma_keys->dk_usable <= 0) {
- if (insertion_resize(mp) < 0) {
- return NULL;
- }
- }
- Py_ssize_t hashpos = find_empty_slot(mp->ma_keys, hash);
- ep0 = DK_ENTRIES(mp->ma_keys);
- ep = &ep0[mp->ma_keys->dk_nentries];
- dictkeys_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
- Py_INCREF(key);
- Py_INCREF(value);
- MAINTAIN_TRACKING(mp, key, value);
- ep->me_key = key;
- ep->me_hash = hash;
- if (_PyDict_HasSplitTable(mp)) {
- assert(mp->ma_values[mp->ma_keys->dk_nentries] == NULL);
- mp->ma_values[mp->ma_keys->dk_nentries] = value;
- }
- else {
- ep->me_value = value;
- }
- mp->ma_used++;
- mp->ma_version_tag = DICT_NEXT_VERSION();
- mp->ma_keys->dk_usable--;
- mp->ma_keys->dk_nentries++;
- assert(mp->ma_keys->dk_usable >= 0);
- }
- else if (value == NULL) {
- value = defaultobj;
- assert(_PyDict_HasSplitTable(mp));
- assert(ix == mp->ma_used);
- Py_INCREF(value);
- MAINTAIN_TRACKING(mp, key, value);
- mp->ma_values[ix] = value;
- mp->ma_used++;
- mp->ma_version_tag = DICT_NEXT_VERSION();
- }
- ASSERT_CONSISTENT(mp);
- return value;
- }
七、update(dict)
update()是把两个字典合并成一个新的字典,中间有交叉的key,更新替换成新值,没有交叉就直接创建
1、dict_update_common
- static int
- dict_update_common(PyObject *self, PyObject *args, PyObject *kwds,
- const char *methname)
- {
- PyObject *arg = NULL;
- int result = 0;
- if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg)) {
- result = -1;
- }
- else if (arg != NULL) {
- if (PyDict_CheckExact(arg)) {
- result = PyDict_Merge(self, arg, 1);
- }
- else {
- _Py_IDENTIFIER(keys);
- PyObject *func;
- if (_PyObject_LookupAttrId(arg, &PyId_keys, &func) < 0) {
- result = -1;
- }
- else if (func != NULL) {
- Py_DECREF(func);
- result = PyDict_Merge(self, arg, 1);
- }
- else {
- result = PyDict_MergeFromSeq2(self, arg, 1);
- }
- }
- }
- if (result == 0 && kwds != NULL) {
- if (PyArg_ValidateKeywordArguments(kwds))
- result = PyDict_Merge(self, kwds, 1);
- else
- result = -1;
- }
- return result;
- }
2、dict_update
- static PyObject *
- dict_update(PyObject *self, PyObject *args, PyObject *kwds)
- {
- if (dict_update_common(self, args, kwds, "update") != -1)
- Py_RETURN_NONE;
- return NULL;
- }
- /* Update unconditionally replaces existing items.
- Merge has a 3rd argument 'override'; if set, it acts like Update,
- otherwise it leaves existing items unchanged.
- PyDict_{Update,Merge} update/merge from a mapping object.
- PyDict_MergeFromSeq2 updates/merges from any iterable object
- producing iterable objects of length 2.
- */
3、PyDict_Update
- int
- PyDict_Update(PyObject *a, PyObject *b)
- {
- return dict_merge(a, b, 1);
- }
八、items()将字典转换为列表
1、PyDict_Items
- PyObject *
- PyDict_Items(PyObject *mp)
- {
- if (mp == NULL || !PyDict_Check(mp)) {
- PyErr_BadInternalCall();
- return NULL;
- }
- return dict_items((PyDictObject *)mp);
- }
- /* Return 1 if dicts equal, 0 if not, -1 if error.
- * Gets out as soon as any difference is detected.
- * Uses only Py_EQ comparison.
- */
九、fromkeys(list,默认值)
1、_PyDict_FromKeys
- /* Internal version of dict.from_keys(). It is subclass-friendly. */
- PyObject *
- _PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
- {
- PyObject *it; /* iter(iterable) */
- PyObject *key;
- PyObject *d;
- int status;
- d = _PyObject_CallNoArg(cls);
- if (d == NULL)
- return NULL;
- if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
- if (PyDict_CheckExact(iterable)) {
- PyDictObject *mp = (PyDictObject *)d;
- PyObject *oldvalue;
- Py_ssize_t pos = 0;
- PyObject *key;
- Py_hash_t hash;
- if (dictresize(mp, ESTIMATE_SIZE(PyDict_GET_SIZE(iterable)))) {
- Py_DECREF(d);
- return NULL;
- }
- while (_PyDict_Next(iterable, &pos, &key, &oldvalue, &hash)) {
- if (insertdict(mp, key, hash, value)) {
- Py_DECREF(d);
- return NULL;
- }
- }
- return d;
- }
- if (PyAnySet_CheckExact(iterable)) {
- PyDictObject *mp = (PyDictObject *)d;
- Py_ssize_t pos = 0;
- PyObject *key;
- Py_hash_t hash;
- if (dictresize(mp, ESTIMATE_SIZE(PySet_GET_SIZE(iterable)))) {
- Py_DECREF(d);
- return NULL;
- }
- while (_PySet_NextEntry(iterable, &pos, &key, &hash)) {
- if (insertdict(mp, key, hash, value)) {
- Py_DECREF(d);
- return NULL;
- }
- }
- return d;
- }
- }
- it = PyObject_GetIter(iterable);
- if (it == NULL){
- Py_DECREF(d);
- return NULL;
- }
- if (PyDict_CheckExact(d)) {
- while ((key = PyIter_Next(it)) != NULL) {
- status = PyDict_SetItem(d, key, value);
- Py_DECREF(key);
- if (status < 0)
- goto Fail;
- }
- } else {
- while ((key = PyIter_Next(it)) != NULL) {
- status = PyObject_SetItem(d, key, value);
- Py_DECREF(key);
- if (status < 0)
- goto Fail;
- }
- }
- if (PyErr_Occurred())
- goto Fail;
- Py_DECREF(it);
- return d;
- Fail:
- Py_DECREF(it);
- Py_DECREF(d);
- return NULL;
- }
2、dict_fromkeys_impl
- static PyObject *
- dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value)
- /*[clinic end generated code: output=8fb98e4b10384999 input=382ba4855d0f74c3]*/
- {
- return _PyDict_FromKeys((PyObject *)type, iterable, value);
- }
- static int
- dict_update_common(PyObject *self, PyObject *args, PyObject *kwds,
- const char *methname)
- {
- PyObject *arg = NULL;
- int result = 0;
- if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg)) {
- result = -1;
- }
- else if (arg != NULL) {
- if (PyDict_CheckExact(arg)) {
- result = PyDict_Merge(self, arg, 1);
- }
- else {
- _Py_IDENTIFIER(keys);
- PyObject *func;
- if (_PyObject_LookupAttrId(arg, &PyId_keys, &func) < 0) {
- result = -1;
- }
- else if (func != NULL) {
- Py_DECREF(func);
- result = PyDict_Merge(self, arg, 1);
- }
- else {
- result = PyDict_MergeFromSeq2(self, arg, 1);
- }
- }
- }
- if (result == 0 && kwds != NULL) {
- if (PyArg_ValidateKeywordArguments(kwds))
- result = PyDict_Merge(self, kwds, 1);
- else
- result = -1;
- }
- return result;
- }
- /* Note: dict.update() uses the METH_VARARGS|METH_KEYWORDS calling convention.
- Using METH_FASTCALL|METH_KEYWORDS would make dict.update(**dict2) calls
- slower, see the issue #29312. */
十、Clea清空字典
1、PyDict_ClearFreeList
- int
- PyDict_ClearFreeList(void)
- {
- PyDictObject *op;
- int ret = numfree + numfreekeys;
- while (numfree) {
- op = free_list[--numfree];
- assert(PyDict_CheckExact(op));
- PyObject_GC_Del(op);
- }
- while (numfreekeys) {
- PyObject_FREE(keys_free_list[--numfreekeys]);
- }
- return ret;
- }
2、PyDict_Clea
- void
- PyDict_Clear(PyObject *op)
- {
- PyDictObject *mp;
- PyDictKeysObject *oldkeys;
- PyObject **oldvalues;
- Py_ssize_t i, n;
- if (!PyDict_Check(op))
- return;
- mp = ((PyDictObject *)op);
- oldkeys = mp->ma_keys;
- oldvalues = mp->ma_values;
- if (oldvalues == empty_values)
- return;
- /* Empty the dict... */
- dictkeys_incref(Py_EMPTY_KEYS);
- mp->ma_keys = Py_EMPTY_KEYS;
- mp->ma_values = empty_values;
- mp->ma_used = 0;
- mp->ma_version_tag = DICT_NEXT_VERSION();
- /* ...then clear the keys and values */
- if (oldvalues != NULL) {
- n = oldkeys->dk_nentries;
- for (i = 0; i < n; i++)
- Py_CLEAR(oldvalues[i]);
- free_values(oldvalues);
- dictkeys_decref(oldkeys);
- }
- else {
- assert(oldkeys->dk_refcnt == 1);
- dictkeys_decref(oldkeys);
- }
- ASSERT_CONSISTENT(mp);
- }
3、dict_clear
- static PyObject *
- dict_clear(PyDictObject *mp, PyObject *Py_UNUSED(ignored))
- {
- PyDict_Clear((PyObject *)mp);
- Py_RETURN_NONE;
- }
4、dict_tp_clear
- static int
- dict_tp_clear(PyObject *op)
- {
- PyDict_Clear(op);
- return 0;
- }
Python源码:字典的更多相关文章
- [python 源码]字符串对象的实现
还是带着问题上路吧,和整数对象的实现同样的问题: >>> a='abc' >>> b='abc' >>> a is b True >> ...
- [python]源码-对象的创建和行为
(明天论文就要送审了!!!距离毕业一个月!!!) 现在还记得刚开始学python时候被这种动态语言惊到的那种感觉,列表和字典对象可以随意伸缩,简直不能更帅了,但是一直不知道内部到底是怎么实现的,pyt ...
- Python源码读后小结
Python 笔记 前言(还是叫杂记吧) 在python中一切皆对象, python中的对象体系大致包含了"类型对象", "Mapping对象(dict)", ...
- Python源码剖析——02虚拟机
<Python源码剖析>笔记 第七章:编译结果 1.大概过程 运行一个Python程序会经历以下几个步骤: 由解释器对源文件(.py)进行编译,得到字节码(.pyc文件) 然后由虚拟机按照 ...
- Python源码剖析——01内建对象
<Python源码剖析>笔记 第一章:对象初识 对象是Python中的核心概念,面向对象中的"类"和"对象"在Python中的概念都为对象,具体分为 ...
- 读python源码--对象模型
学python的人都知道,python中一切皆是对象,如class生成的对象是对象,class本身也是对象,int是对象,str是对象,dict是对象....所以,我很好奇,python是怎样实现这些 ...
- VS2013编译python源码
系统:win10 手头有个python模块,是用C写的,想编译安装就需要让python调用C编译器.直接编译发现使用的是vc9编译,不支持C99标准(两个槽点:为啥VS2008都还不支持C99?手头这 ...
- 三种排序算法python源码——冒泡排序、插入排序、选择排序
最近在学习python,用python实现几个简单的排序算法,一方面巩固一下数据结构的知识,另一方面加深一下python的简单语法. 冒泡排序算法的思路是对任意两个相邻的数据进行比较,每次将最小和最大 ...
- 《python源码剖析》笔记一——python编译
1.python的架构: 2.python源码的组织结构: 3.windows环境下编译python:
- 转换器5:参考Python源码,实现Php代码转Ast并直接运行
前两个周末写了<手写PHP转Python编译器>的词法,语法分析部分,上个周末卡文了. 访问器部分写了两次都不满意,没办法,只好停下来,参考一下Python的实现.我实现的部分正好和Pyt ...
随机推荐
- 【转】关于web项目中的图片上传、并在前端显示问题(tomcat中配置文件上传虚拟路径)
一.数据库存储 直接把图片的二进制码存到数据库,可参考blog:http://blog.csdn.net/hope2jiang/article/details/590733 直接存图片在mysql上面 ...
- Win32 程序开发:窗口类结构体 WNDCLASS 和 WNDCLASSEX
一.窗口类结构体简介 窗口类结构体包含了窗口的各种参数信息.比如:窗口的图标.菜单栏.背景颜色.窗口的消息处理等等. 窗口类结构体有两个:WNDCLASS(早期版本) 和 WNDCLASSEX(新版本 ...
- 简单的Python GUI界面框架
Python开发GUI界面, 可以使用pyQT或者wxpython. 不过不论pyQT还是wxpython都需要比较多的学习成本.Python工程往往是用于快速开发的,有些时候引入pyQT,wxpyt ...
- Saiku使用iframe嵌入页面访问地址配置化(二十八)--DWR的基本使用
Saiku使用iframe嵌入页面使用时ip与端口配置化(二十八)--DWR的基本使用 DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开 ...
- 【Oracle命令 】使用的sql语句之分组查询(group by)
由于本人并未对oracle数据库进行深入了解,但是工作中又需要知道一些基础的sql,所以记录下操作的sql语句.方便日后查看 1.将序列号作为分组查询的条件,再将查询出来的结果进行筛选. select ...
- 【文本处理命令】之awk命令详解
一.awk命令简介 awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等.在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将 ...
- 拎壶学python3-----(3)python之while循环用法
一.下边我们看一个简单的while循环 那怎么计数呢就让输入三次三次后退出: 二. 关于计数这个问题我们一起看一下 (1)关于计数如下: 我们发现这个计数根本停不下来,怎么才能搞成我们想要的计数次数呢 ...
- 图解隐马尔可夫模型(HMM)
写在前面 最近在写论文过程中,研究了一些关于概率统计的算法,也从网上收集了不少资料,在此整理一下与各位朋友分享. 隐马尔可夫模型,简称HMM(Hidden Markov Model), 是一种基于概率 ...
- route 相关设置
Debian系统 查看路由表: root@debian:~# ip route default via 192.168.6.1 dev enp4s0 10.0.0.0/24 dev br0 proto ...
- echarts地图map城市间如何连线
let bjData = [ [{name:'北京'}, {name:'上海',value:95}], [{name:'北京'}, {name:'广州',value:90}]]; let conver ...