On this page
Dictionary Objects
PyDictObject
- PyObject的此子类型表示 Python 字典对象。
PyTypeObject
PyDict_Type
- PyTypeObject的此实例表示 Python 字典类型。这对于
dict
和types.DictType
暴露给 Python 程序。
- PyTypeObject的此实例表示 Python 字典类型。这对于
- int
PyDict_Check
(PyObject ** p *)- 如果* p *是 dict 对象或 dict 类型的子类型的实例,则返回 true。
在版本 2.2 中更改:接受允许的子类型。
- int
PyDict_CheckExact
(PyObject ** p *)- 如果* p *是 dict 对象,但不是 dict 类型的子类型的实例,则返回 true。
2.4 版的新Function。
- PyObject*
PyDict_New
( )- 返回值:新参考.
返回一个新的空字典,否则返回* NULL *。
返回强制执行只读行为的 Map 的代理对象。这通常用于创建代理,以防止修改非动态类类型的字典。
2.2 版中的新Function。
无效
PyDict_Clear
(PyObject ** p *)- 清空所有键值对的现有字典。
int
PyDict_Contains
(PyObject *p ,PyObject key *)- 确定字典* p 是否包含 key 。如果 p 中的项与 key *相匹配,则返回
1
,否则返回0
。出错时,返回-1
。这等效于 Python 表达式key in p
。
- 确定字典* p 是否包含 key 。如果 p 中的项与 key *相匹配,则返回
2.4 版的新Function。
返回一个新字典,该字典包含与* p *相同的键值对。
1.6 版中的新Function。
int
PyDict_SetItem
(PyObject *p ,PyObject key *,PyObject ** val *)int
PyDict_SetItemString
(PyObject *p ,const char key *,PyObject ** val *)- 使用* key 作为键,将 value 插入字典 p *中。 * key *应该是
char*
。关键对象是使用PyString_FromString(key)
创建的。如果成功则返回0
,如果失败则返回-1
。
- 使用* key 作为键,将 value 插入字典 p *中。 * key *应该是
int
PyDict_DelItem
(PyObject *p ,PyObject key *)- 使用键* key 删除字典 p *中的条目。 键必须是可哈希的;如果不是,则引发TypeError。成功返回
0
,失败返回-1
。
- 使用键* key 删除字典 p *中的条目。 键必须是可哈希的;如果不是,则引发TypeError。成功返回
int
PyDict_DelItemString
(PyObject *p ,char key *)- 删除字典* p 中的条目,该条目具有由字符串 key *指定的键。成功返回
0
或失败返回-1
。
- 删除字典* p 中的条目,该条目具有由字符串 key *指定的键。成功返回
PyObject *
PyDict_GetItem
(PyObject p ,PyObject 密钥)- *返回值:借用参考。
从具有键* key 的字典 p 返回对象。如果键 key 不存在,但没有设置异常,则返回 NULL *。
这与PyDict_GetItem()相同,但是* key *被指定为char*
而不是PyObject*。
返回一个包含字典中所有项目的PyListObject,如字典方法dict.items()一样。
与字典方法dict.keys()一样,返回包含字典中所有键的PyListObject。
与字典方法dict.values()一样,返回包含字典* p *中所有值的PyListObject。
- Py_ssize_t
PyDict_Size
(PyObject ** p *)- 返回字典中的项目数。这相当于字典上的
len(p)
。
- 返回字典中的项目数。这相当于字典上的
在版本 2.5 中进行了更改:此函数返回了int
类型。这可能需要更改您的代码以正确支持 64 位系统。
- int
PyDict_Next
(PyObject *p ,Py_ssize_t ppos ,PyObject *** pkey ,PyObject * pvalue *)- 遍历字典* p *中的所有键值对。 * ppos 所引用的
Py_ssize_t
必须在第一次调用此函数开始迭代之前初始化为0
;该函数对字典中的每对返回 true,一旦报告所有对,则返回 false。参数 pkey 和 pvalue 要么指向将分别用每个键和值填充的PyObject*变量,要么可以为 NULL *。pass它们返回的所有引用都是借用的。 * ppos *不应在迭代过程中更改。它的值表示内部字典结构中的偏移量,并且由于结构稀疏,因此偏移量不是连续的。
- 遍历字典* p *中的所有键值对。 * ppos 所引用的
For example:
PyObject *key, *value;
Py_ssize_t pos = 0;
while (PyDict_Next(self->dict, &pos, &key, &value)) {
/* do something interesting with the values... */
...
}
字典* p *不应在迭代过程中发生突变。在字典上迭代时修改键的值是安全的(自 Python 2.1 起),但前提是只要键的集合不变即可。例如:
PyObject *key, *value;
Py_ssize_t pos = 0;
while (PyDict_Next(self->dict, &pos, &key, &value)) {
int i = PyInt_AS_LONG(value) + 1;
PyObject *o = PyInt_FromLong(i);
if (o == NULL)
return -1;
if (PyDict_SetItem(self->dict, key, o) < 0) {
Py_DECREF(o);
return -1;
}
Py_DECREF(o);
}
在版本 2.5 中更改:此函数对* ppos *使用了int *
类型。这可能需要更改您的代码以正确支持 64 位系统。
- int
PyDict_Merge
(PyObject *a ,PyObject b *,int * override *)- 遍历 Map 对象* b ,将键值对添加到字典 a *。 * b 可以是字典,也可以是任何支持PyMapping_Keys()和PyObject_GetItem()的对象。如果 override 为 true,则在 b 中找到匹配键时,将替换 a 中的现有对,否则,仅在 a *中没有匹配键时才添加对。成功返回
0
,如果引发异常则返回-1
。
- 遍历 Map 对象* b ,将键值对添加到字典 a *。 * b 可以是字典,也可以是任何支持PyMapping_Keys()和PyObject_GetItem()的对象。如果 override 为 true,则在 b 中找到匹配键时,将替换 a 中的现有对,否则,仅在 a *中没有匹配键时才添加对。成功返回
2.2 版中的新Function。
- 整数
PyDict_Update
(PyObject *a ,PyObject b *)- 这与 C 语言中的
PyDict_Merge(a, b, 1)
相同,并且与 Python 中的a.update(b)
相似,不同之处在于,如果第二个参数不具有“ keys”属性,则PyDict_Update()不会回退到一系列键值对上。成功返回0
,如果引发异常则返回-1
。
- 这与 C 语言中的
2.2 版中的新Function。
- int
PyDict_MergeFromSeq2
(PyObject *a ,PyObject seq2 *,int * override *)- 从* seq2 中的键值对更新或合并到字典 a *中。 * seq2 必须是可迭代对象,生成长度为 2 的可迭代对象,被视为键值对。如果键重复,则如果 override *为 true,则最后一个获胜,否则,第一个获胜。成功返回
0
,如果引发异常则返回-1
。等效的 Python(返回值除外):
- 从* seq2 中的键值对更新或合并到字典 a *中。 * seq2 必须是可迭代对象,生成长度为 2 的可迭代对象,被视为键值对。如果键重复,则如果 override *为 true,则最后一个获胜,否则,第一个获胜。成功返回
def PyDict_MergeFromSeq2(a, seq2, override):
for key, value in seq2:
if override or key not in a:
a[key] = value
2.2 版中的新Function。