字典对象 — Python 文档
字典对象
- type PyDictObject
- PyObject 的这个子类型表示一个 Python 字典对象。
- PyTypeObject PyDict_Type
- PyTypeObject 的这个实例表示 Python 字典类型。 这以
dict
和types.DictType
的形式暴露给 Python 程序。
- int PyDict_Check(PyObject *p)
如果 p 是 dict 对象或 dict 类型的子类型的实例,则返回 true。
在 2.2 版更改:允许接受子类型。
- int PyDict_CheckExact(PyObject *p)
如果 p 是 dict 对象,但不是 dict 类型的子类型的实例,则返回 true。
2.4 版中的新功能。
- PyObject *PyDict_New()
- 返回一个新的空字典,或者失败时返回 NULL。
- void PyDict_Clear(PyObject *p)
- 清空所有键值对的现有字典。
- int PyDict_Contains(PyObject *p, PyObject *key)
确定字典 p 是否包含 key。 如果 p 中的一项与 key 匹配,则返回
1
,否则返回0
。 出错时,返回-1
。 这相当于 Python 表达式key in p
。2.4 版中的新功能。
- 将value插入到字典p中,键为key。 key 必须是 hashable; 如果不是,
TypeError
将被提升。 成功时返回0
,失败时返回-1
。
- 使用 key 作为键,将 value 插入到字典 p 中。 key 应该是
char*
。 关键对象是使用PyString_FromString(key)
创建的。 成功时返回0
,失败时返回-1
。
- 使用键 键 删除字典 p 中的条目。 key 必须是可散列的; 如果不是,则
TypeError
被提升。 成功时返回0
,失败时返回-1
。
- int PyDict_DelItemString(PyObject *p, char *key)
- 删除字典 p 中的条目,该条目具有由字符串 key 指定的键。 成功时返回
0
,失败时返回-1
。
- 从字典 p 返回具有键 key 的对象。 如果键 key 不存在,则返回 NULL,但 没有 设置异常。
- 这与 PyDict_GetItem() 相同,但 key 被指定为
char*
,而不是PyObject*
。
- 返回包含字典中所有项目的 PyListObject,如字典方法 dict.items()。
- 返回包含字典中所有键的 PyListObject,如字典方法 dict.keys()。
- 返回包含字典 p 中所有值的 PyListObject,如字典方法 dict.values()。
- 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
才能开始迭代; 该函数为字典中的每一对返回真,一旦报告了所有对,则返回假。 参数 pkey 和 pvalue 应该指向PyObject*
变量,这些变量将分别用每个键和值填充,或者可以是 NULL ]。 通过它们返回的任何引用都是借用的。 ppos 不应在迭代期间更改。 它的值代表内部字典结构内的偏移量,由于结构稀疏,偏移量不连续。例如:
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 版更改:此功能使用
int *
类型用于 ppos。 这可能需要更改您的代码才能正确支持 64 位系统。
- int PyDict_Merge(PyObject *a, PyObject *b, int override)
迭代映射对象 b 将键值对添加到字典 a。 b 可以是字典,或者任何支持 PyMapping_Keys() 和 PyObject_GetItem() 的对象。 如果 override 为真,如果在 b 中找到匹配的键,则 a 中的现有对将被替换,否则只有在没有匹配键时才会添加对a 中的匹配键。 成功时返回
0
,如果引发异常则返回-1
。2.2 版中的新功能。
- int PyDict_Update(PyObject *a, PyObject *b)
这与 C 中的
PyDict_Merge(a, b, 1)
相同,并且与 Python 中的a.update(b)
相似,除了 PyDict_Update() 不会回退到对一系列键进行迭代如果第二个参数没有“keys”属性,则值对。 成功时返回0
,如果引发异常则返回-1
。2.2 版中的新功能。
- int PyDict_MergeFromSeq2(PyObject *a, PyObject *seq2, int override)
从 seq2 中的键值对更新或合并到字典 a。 seq2 必须是一个可迭代对象,产生长度为 2 的可迭代对象,被视为键值对。 在重复键的情况下,如果 override 为真,则最后一个获胜,否则第一个获胜。 成功时返回
0
,如果引发异常则返回-1
。 等效的 Python(返回值除外):def PyDict_MergeFromSeq2(a, seq2, override): for key, value in seq2: if override or key not in a: a[key] = value
2.2 版中的新功能。