集合对象¶
这一章节详细介绍了 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()
) 来访问。
-
PySetObject
¶ 这个
PyObject
的子类型被用来保存set
和frozenset
对象的内部数据。 它类似于PyDictObject
,因为对于小尺寸集合来说它是固定大小的(很像元组的存储方式),并且对于中等和大尺寸集合来说它将指向单独的可变大小的内存块(很像列表的存储方式)。 此结构体的字段不应被视为公有并且可能发生改变。 所有访问应当通过已写入文档的 API 来进行,而不可通过操纵结构体中的值。
-
PyTypeObject
PySet_Type
¶ 这是一个
PyTypeObject
实例,表示 Pythonset
类型。
-
PyTypeObject
PyFrozenSet_Type
¶ 这是一个
PyTypeObject
实例,表示 Pythonfrozenset
类型。
下列类型检查宏适用于指向任意 Python 对象的指针。 类似地,这些构造函数也适用于任意可迭代的 Python 对象。
-
PyObject*
PySet_New
(PyObject *iterable)¶ - Return value: New reference.
Return a new
set
containing objects returned by the iterable. The iterable may be NULL to create a new empty set. Return the new set on success or NULL on failure. RaiseTypeError
if iterable is not actually iterable. The constructor is also useful for copying a set (c=set(s)
).
-
PyObject*
PyFrozenSet_New
(PyObject *iterable)¶ - Return value: New reference.
Return a new
frozenset
containing objects returned by the iterable. The iterable may be NULL to create a new empty frozenset. Return the new set on success or NULL on failure. RaiseTypeError
if iterable is not actually iterable.
下列函数和宏适用于 set
或 frozenset
的实例或是其子类型的实例。
-
Py_ssize_t
PySet_Size
(PyObject *anyset)¶ 返回
set
或frozenset
对象的长度。 等价于len(anyset)
。 如果 anyset 不是set
,frozenset
或其子类型的实例则会引发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 不是set
,frozenset
或其子类型的实例则会引发PyExc_SystemError
。
-
int
PySet_Add
(PyObject *set, PyObject *key)¶ 添加 key 到一个
set
实例。 也可用于frozenset
实例(类似于PyTuple_SetItem()
,它可被用来为全新冻结集合在公开给其他代码之前填充全新的值)。 成功时返回0
,失败时返回-1
。 如果 key 为不可哈希对象则会引发TypeError
。 如果没有增长空间则会引发MemoryError
。 如果 set 不是set
或其子类型的实例则会引发SystemError
。
下列函数适用于 set
或其子类型的实例,但不可用于 frozenset
或其子类型的实例。
-
int
PySet_Discard
(PyObject *set, PyObject *key)¶ 如果找到并移除返回
1
,如果未找到(无操作)返回0
,如果遇到错误则返回-1
。 对于不存在的键不会引发KeyError
。 如果 key 为不可哈希对象则会引发TypeError
。 不同于 Pythondiscard()
方法,此函数不会自动将不可哈希的集合转换为临时的冻结集合。 如果 set 不是set
或其子类型的实例则会引发PyExc_SystemError
。
-
PyObject*
PySet_Pop
(PyObject *set)¶ - Return value: New reference.
Return a new reference to an arbitrary object in the set, and removes the object from the set. Return NULL on failure. Raise
KeyError
if the set is empty. Raise aSystemError
if set is not an instance ofset
or its subtype.
-
int
PySet_ClearFreeList
()¶ 清空释放列表。 返回所释放的条目数。
3.3 新版功能.