字典对象 — Python 文档

来自菜鸟教程
Python/docs/2.7/c-api/dict
跳转至:导航、​搜索

字典对象

type PyDictObject
PyObject 的这个子类型表示一个 Python 字典对象。
PyTypeObject PyDict_Type
PyTypeObject 的这个实例表示 Python 字典类型。 这以 dicttypes.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
PyObject *PyDictProxy_New(PyObject *dict)

为强制执行只读行为的映射返回代理对象。 这通常用于创建代理以防止修改非动态类类型的字典。

2.2 版中的新功能。

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 版中的新功能。

PyObject *PyDict_Copy(PyObject *p)

返回包含与 p 相同的键值对的新字典。

1.6 版中的新功能。

int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val)
value插入到字典p中,键为keykey 必须是 hashable; 如果不是,TypeError 将被提升。 成功时返回 0,失败时返回 -1
int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val)
使用 key 作为键,将 value 插入到字典 p 中。 key 应该是 char*。 关键对象是使用 PyString_FromString(key) 创建的。 成功时返回 0,失败时返回 -1
int PyDict_DelItem(PyObject *p, PyObject *key)
使用键 删除字典 p 中的条目。 key 必须是可散列的; 如果不是,则 TypeError 被提升。 成功时返回 0,失败时返回 -1
int PyDict_DelItemString(PyObject *p, char *key)
删除字典 p 中的条目,该条目具有由字符串 key 指定的键。 成功时返回 0,失败时返回 -1
PyObject *PyDict_GetItem(PyObject *p, PyObject *key)
从字典 p 返回具有键 key 的对象。 如果键 key 不存在,则返回 NULL,但 没有 设置异常。
PyObject *PyDict_GetItemString(PyObject *p, const char *key)
这与 PyDict_GetItem() 相同,但 key 被指定为 char*,而不是 PyObject*
PyObject *PyDict_Items(PyObject *p)
返回包含字典中所有项目的 PyListObject,如字典方法 dict.items()
PyObject *PyDict_Keys(PyObject *p)
返回包含字典中所有键的 PyListObject,如字典方法 dict.keys()
PyObject *PyDict_Values(PyObject *p)
返回包含字典 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才能开始迭代; 该函数为字典中的每一对返回真,一旦报告了所有对,则返回假。 参数 pkeypvalue 应该指向 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 将键值对添加到字典 ab 可以是字典,或者任何支持 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 中的键值对更新或合并到字典 aseq2 必须是一个可迭代对象,产生长度为 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 版中的新功能。