集合对象¶
本节详细介绍了 set
和 frozenset
对象的公共 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()
、 PyNumber_InPlaceSubtract()
、 PyNumber_InPlaceOr()
和 PyNumber_InPlaceXor()
)来访问。
-
type PySetObject¶
这个
PyObject
的子类型用于保存set
和frozenset
对象的内部数据。它类似于PyDictObject
,对于小型集合,它的大小是固定的(非常类似于元组存储),并且对于中大型集合,它将指向一个单独的、大小可变的内存块(非常类似于列表存储)。此结构的任何字段都不应被视为公共字段,并且所有字段都可能会发生更改。所有访问都应通过记录的 API 完成,而不是通过操作结构中的值完成。
-
PyTypeObject PySet_Type¶
- 属于 稳定 ABI 的一部分。
这是
PyTypeObject
的一个实例,表示 Pythonset
类型。
-
PyTypeObject PyFrozenSet_Type¶
- 属于 稳定 ABI 的一部分。
这是
PyTypeObject
的一个实例,表示 Pythonfrozenset
类型。
以下类型检查宏适用于指向任何 Python 对象的指针。同样,构造函数适用于任何可迭代的 Python 对象。
-
PyObject *PySet_New(PyObject *iterable)¶
- 返回值:新引用。属于 稳定 ABI 的一部分。
返回一个新的
set
,其中包含 iterable 返回的对象。 iterable 可以为NULL
来创建一个新的空集合。成功时返回新集合,失败时返回NULL
。如果 iterable 实际上不可迭代,则引发TypeError
。构造函数也适用于复制集合(c=set(s)
)。
-
PyObject *PyFrozenSet_New(PyObject *iterable)¶
- 返回值:新引用。属于 稳定 ABI 的一部分。
返回一个由iterable返回的对象组成的新
frozenset
。 iterable 可以是NULL
以创建一个新的空 frozenset。 成功时返回新的集合,失败时返回NULL
。 如果 iterable 实际上不是可迭代的,则引发TypeError
。
以下函数和宏可用于 set
或 frozenset
的实例或其子类型的实例。
-
Py_ssize_t PySet_Size(PyObject *anyset)¶
- 属于 稳定 ABI 的一部分。
返回
set
或frozenset
对象的长度。等同于len(anyset)
。如果 anyset 不是set
,frozenset
或其子类型的实例,则引发SystemError
。
-
Py_ssize_t PySet_GET_SIZE(PyObject *anyset)¶
PySet_Size()
的宏形式,不进行错误检查。
-
int PySet_Contains(PyObject *anyset, PyObject *key)¶
- 属于 稳定 ABI 的一部分。
如果找到,则返回
1
;如果未找到,则返回0
;如果遇到错误,则返回-1
。与 Python 的__contains__()
方法不同,此函数不会自动将不可哈希的集合转换为临时的 frozenset。如果 key 不可哈希,则引发TypeError
。如果 anyset 不是set
,frozenset
或其子类型的实例,则引发SystemError
。
-
int PySet_Add(PyObject *set, PyObject *key)¶
- 属于 稳定 ABI 的一部分。
将 key 添加到
set
实例。也适用于frozenset
实例(如PyTuple_SetItem()
,可用于在将全新的 frozenset 公开给其他代码之前填充其值)。成功时返回0
,失败时返回-1
。如果 key 不可哈希,则引发TypeError
。如果没有空间增长,则引发MemoryError
。如果 set 不是set
或其子类型的实例,则引发SystemError
。
以下函数可用于 set
或其子类型的实例,但不能用于 frozenset
或其子类型的实例。
-
int PySet_Discard(PyObject *set, PyObject *key)¶
- 属于 稳定 ABI 的一部分。
如果找到并删除,则返回
1
;如果未找到(未执行任何操作),则返回0
;如果遇到错误,则返回-1
。不会为缺少的键引发KeyError
。如果 key 不可哈希,则引发TypeError
。与 Python 的discard()
方法不同,此函数不会自动将不可哈希的集合转换为临时的 frozenset。如果 set 不是set
或其子类型的实例,则引发SystemError
。
-
PyObject *PySet_Pop(PyObject *set)¶
- 返回值:新引用。属于 稳定 ABI 的一部分。
返回对 set 中任意对象的新引用,并从 set 中删除该对象。失败时返回
NULL
。如果集合为空,则引发KeyError
。如果 set 不是set
或其子类型的实例,则引发SystemError
。
-
int PySet_Clear(PyObject *set)¶
- 属于 稳定 ABI 的一部分。
清空现有集合中的所有元素。成功时返回
0
。如果set不是set
或其子类型的实例,则返回-1
并引发SystemError
。