设置对象 — Python 文档

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

设置对象

本节详细介绍了 setfrozenset 对象的公共 API。 下面未列出的任何功能最好使用抽象对象协议(包括 PyObject_CallMethod()PyObject_RichCompareBool()PyObject_Hash()PyObject_Repr()PyObject_IsTrue()PyObject_Print()PyObject_GetIter())或抽象数协议(包括PyNumber_And( ),PyNumber_Subtract(),PyNumber_Or(),PyNumber_Xor(),PyNumber_InPlaceAnd(),SubtractNumber_InPlace )PyNumber_InPlaceOr()PyNumber_InPlaceXor())。

type PySetObject
PyObject 的这个子类型用于保存 setfrozenset 对象的内部数据。 它就像一个 PyDictObject,因为它是小集合的固定大小(很像元组存储),并且将指向一个单独的、可变大小的内存块用于中型和大型集(很像列表存储) )。 此结构的任何字段都不应被视为公共字段,并且可能会发生变化。 所有访问都应该通过文档化的 API 来完成,而不是通过操作结构中的值来完成。
PyTypeObject PySet_Type
这是 PyTypeObject 的一个实例,代表 Python set 类型。
PyTypeObject PyFrozenSet_Type
这是 PyTypeObject 的一个实例,代表 Python frozenset 类型。

以下类型检查宏适用于指向任何 Python 对象的指针。 同样,构造函数可用于任何可迭代的 Python 对象。

int PySet_Check(PyObject *p)
如果 pset 对象或子类型的实例,则返回 true。
int PyFrozenSet_Check(PyObject *p)
如果 pfrozenset 对象或子类型的实例,则返回 true。
int PyAnySet_Check(PyObject *p)
如果 pset 对象、frozenset 对象或子类型的实例,则返回 true。
int PyAnySet_CheckExact(PyObject *p)
如果 pset 对象或 frozenset 对象但不是子类型的实例,则返回 true。
int PyFrozenSet_CheckExact(PyObject *p)
如果 pfrozenset 对象但不是子类型的实例,则返回 true。
PyObject *PySet_New(PyObject *iterable)
返回一个新的 set,其中包含由 iterable 返回的对象。 iterable 可以是 NULL 来创建一个新的空集。 成功时返回新集合,失败时返回 NULL。 如果 iterable 实际上不是可迭代的,则引发 TypeError。 构造函数也可用于复制集合 (c=set(s))。
PyObject *PyFrozenSet_New(PyObject *iterable)
返回一个新的 frozenset,其中包含由 iterable 返回的对象。 iterable 可以是 NULL 来创建一个新的空冻结集。 成功时返回新集合,失败时返回 NULL。 如果 iterable 实际上不是可迭代的,则引发 TypeError

以下函数和宏可用于 setfrozenset 的实例或其子类型的实例。

Py_ssize_t PySet_Size(PyObject *anyset)
返回 setfrozenset 对象的长度。 相当于 len(anyset)。 如果 anyset 不是 setfrozenset 或子类型的实例,则引发 PyExc_SystemError
Py_ssize_t PySet_GET_SIZE(PyObject *anyset)
PySet_Size() 的宏形式,没有错误检查。
int PySet_Contains(PyObject *anyset, PyObject *key)
如果找到则返回 1,如果未找到则返回 0,如果遇到错误则返回 -1。 与 Python __contains__() 方法不同,此函数不会自动将不可散列集转换为临时冻结集。 如果 key 不可散列,则引发 TypeError。 如果 anyset 不是 setfrozenset 或子类型的实例,则提高 PyExc_SystemError
int PySet_Add(PyObject *set, PyObject *key)
key 添加到 set 实例。 也适用于 frozenset 实例(如 PyTuple_SetItem(),它可用于在全新的frozensets 暴露给其他代码之前填充它们的值)。 成功时返回 0,失败时返回 -1。 如果 key 不可散列,则引发 TypeError。 如果没有增长空间,则引发 MemoryError。 如果 set 不是 set 或其子类型的实例,则引发 SystemError

以下函数可用于 set 或其子类型的实例,但不适用于 frozenset 或其子类型的实例。

int PySet_Discard(PyObject *set, PyObject *key)
如果找到并删除,则返回 1,如果未找到(未采取任何操作),则返回 0,如果遇到错误,则返回 -1。 不会为丢失的键引发 KeyError。 如果 key 不可散列,则引发 TypeError。 与 Python discard() 方法不同,此函数不会自动将不可散列集转换为临时冻结集。 如果 set 不是 set 或其子类型的实例,则提高 PyExc_SystemError
PyObject *PySet_Pop(PyObject *set)
返回对 set 中任意对象的新引用,并从 set 中删除该对象。 失败时返回 NULL。 如果集合为空,则引发 KeyError。 如果 set 不是 set 或其子类型的实例,则引发 SystemError
int PySet_Clear(PyObject *set)
清空所有元素的现有集合。
int PySet_ClearFreeList()

清除空闲列表。 返回已释放项目的总数。

3.3 版中的新功能。