> **Источник:** https://python-all.ru/3.0/c-api/set.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# Объекты множеств

В этом разделе подробно описан публичный API для объектов [`set`](https://python-all.ru/3.0/library/stdtypes.html#set) и [`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset) объектов. Любую функциональность, не перечисленную ниже, лучше всего использовать с помощью абстрактного объектного протокола (включая [`PyObject_CallMethod`](https://python-all.ru/3.0/c-api/object.html#PyObject_CallMethod), [`PyObject_RichCompareBool`](https://python-all.ru/3.0/c-api/object.html#PyObject_RichCompareBool), [`PyObject_Hash`](https://python-all.ru/3.0/c-api/object.html#PyObject_Hash), [`PyObject_Repr`](https://python-all.ru/3.0/c-api/object.html#PyObject_Repr), [`PyObject_IsTrue`](https://python-all.ru/3.0/c-api/object.html#PyObject_IsTrue), [`PyObject_Print`](https://python-all.ru/3.0/c-api/object.html#PyObject_Print), и [`PyObject_GetIter`](https://python-all.ru/3.0/c-api/object.html#PyObject_GetIter)) или абстрактного числового протокола (включая [`PyNumber_And`](https://python-all.ru/3.0/c-api/number.html#PyNumber_And), [`PyNumber_Subtract`](https://python-all.ru/3.0/c-api/number.html#PyNumber_Subtract), [`PyNumber_Or`](https://python-all.ru/3.0/c-api/number.html#PyNumber_Or), [`PyNumber_Xor`](https://python-all.ru/3.0/c-api/number.html#PyNumber_Xor), [`PyNumber_InPlaceAnd`](https://python-all.ru/3.0/c-api/number.html#PyNumber_InPlaceAnd), [`PyNumber_InPlaceSubtract`](https://python-all.ru/3.0/c-api/number.html#PyNumber_InPlaceSubtract), [`PyNumber_InPlaceOr`](https://python-all.ru/3.0/c-api/number.html#PyNumber_InPlaceOr), и [`PyNumber_InPlaceXor`](https://python-all.ru/3.0/c-api/number.html#PyNumber_InPlaceXor)).

**\[PySetObject\]`PySetObject`**

Этот подтип

[`PyObject`](https://python-all.ru/3.0/c-api/structures.html#PyObject)

используется для хранения внутренних данных как для объектов

[`set`](https://python-all.ru/3.0/library/stdtypes.html#set)

, так и для

[`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset)

. Он подобен

[`PyDictObject`](https://python-all.ru/3.0/c-api/dict.html#PyDictObject)

в том, что имеет фиксированный размер для небольших множеств (как хранение кортежей) и будет указывать на отдельный блок памяти переменного размера для средних и больших множеств (как хранение списков). Ни одно из полей этой структуры не должно считаться публичным и может быть изменено. Весь доступ должен осуществляться через документированный API, а не путём манипулирования значениями в структуре.

**\[PySet\_Type\][PyTypeObject](https://python-all.ru/3.0/c-api/type.html#PyTypeObject) `PySet_Type`**

Это экземпляр

[`PyTypeObject`](https://python-all.ru/3.0/c-api/type.html#PyTypeObject)

, представляющий тип

[`set`](https://python-all.ru/3.0/library/stdtypes.html#set)

языка Python.

**\[PyFrozenSet\_Type\][PyTypeObject](https://python-all.ru/3.0/c-api/type.html#PyTypeObject) `PyFrozenSet_Type`**

Это экземпляр

[`PyTypeObject`](https://python-all.ru/3.0/c-api/type.html#PyTypeObject)

, представляющий тип

[`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset)

языка Python.

Следующие макросы проверки типа работают с указателями на любой объект Python. Аналогично, функции-конструкторы работают с любым итерируемым объектом Python.

**\[PySet\_Check\]int `PySet_Check`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*p*)**

Возвращает true, если

*p*

является объектом

[`set`](https://python-all.ru/3.0/library/stdtypes.html#set)

или экземпляром подтипа.

**\[PyFrozenSet\_Check\]int `PyFrozenSet_Check`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*p*)**

Возвращает true, если

*p*

является объектом

[`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset)

или экземпляром подтипа.

**\[PyAnySet\_Check\]int `PyAnySet_Check`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*p*)**

Возвращает true, если

*p*

является объектом

[`set`](https://python-all.ru/3.0/library/stdtypes.html#set)

, объектом

[`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset)

или экземпляром подтипа.

**\[PyAnySet\_CheckExact\]int `PyAnySet_CheckExact`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*p*)**

Возвращает true, если

*p*

является объектом

[`set`](https://python-all.ru/3.0/library/stdtypes.html#set)

или объектом

[`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset)

, но не экземпляром подтипа.

**\[PyFrozenSet\_CheckExact\]int `PyFrozenSet_CheckExact`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*p*)**

Возвращает true, если

*p*

является объектом

[`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset)

, но не экземпляром подтипа.

**\[PySet\_New\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PySet_New`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*iterable*)**

*Возвращаемое значение: новая ссылка.*

Возвращает новый [`set`](https://python-all.ru/3.0/library/stdtypes.html#set), содержащий объекты, возвращаемые *iterable*. Значение *iterable* может быть *NULL* для создания нового пустого set. Возвращает новый set при успехе или *NULL* при неудаче. Вызывает [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError), если *iterable* на самом деле не является итерируемым. Конструктор также полезен для копирования set (`c=set(s)`).

**\[PyFrozenSet\_New\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyFrozenSet_New`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*iterable*)**

*Возвращаемое значение: новая ссылка.*

Возвращает новый [`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset), содержащий объекты, возвращаемые *iterable*. Значение *iterable* может быть *NULL* для создания нового пустого frozenset. Возвращает новый frozenset при успехе или *NULL* при неудаче. Вызывает [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError), если *iterable* на самом деле не является итерируемым.

Следующие функции и макросы доступны для экземпляров [`set`](https://python-all.ru/3.0/library/stdtypes.html#set) или [`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset), а также для экземпляров их подтипов.

**\[PySet\_Size\]Py\_ssize\_t `PySet_Size`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*anyset*)**

Возвращает длину объекта [`set`](https://python-all.ru/3.0/library/stdtypes.html#set) или [`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset). Эквивалентно `len(anyset)`. Вызывает `PyExc_SystemError`, если *anyset* не является [`set`](https://python-all.ru/3.0/library/stdtypes.html#set), [`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset) или экземпляром подтипа.

**\[PySet\_GET\_SIZE\]Py\_ssize\_t `PySet_GET_SIZE`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*anyset*)**

Макро-форма

[`PySet_Size`](https://python-all.ru/3.0/c-api/set.html#PySet_Size)

без проверки ошибок.

**\[PySet\_Contains\]int `PySet_Contains`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*anyset*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*key*)**

Возвращает 1, если найдено, 0, если не найдено, и -1, если возникла ошибка. В отличие от метода Python

[`__contains__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__contains__)

, эта функция не преобразует автоматически нехешируемые множества во временные frozenset. Вызывает

[`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError)

, если

*key*

нехешируем. Вызывает

`PyExc_SystemError`

, если

*anyset*

не является

[`set`](https://python-all.ru/3.0/library/stdtypes.html#set)

,

[`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset)

или экземпляром подтипа.

**\[PySet\_Add\]int `PySet_Add`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*set*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*key*)**

Добавляет

*key*

в экземпляр

[`set`](https://python-all.ru/3.0/library/stdtypes.html#set)

. Также работает с экземплярами

[`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset)

(как

[`PyTuple_SetItem`](https://python-all.ru/3.0/c-api/tuple.html#PyTuple_SetItem)

, это может использоваться для заполнения значений новых frozenset до того, как они будут переданы другому коду). Возвращает 0 в случае успеха или -1 при неудаче. Возбуждает

[`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError)

, если

*key*

нехэшируем. Возбуждает

[`MemoryError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.MemoryError)

, если недостаточно места для роста. Возбуждает

[`SystemError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SystemError)

, если

*set*

не является экземпляром

[`set`](https://python-all.ru/3.0/library/stdtypes.html#set)

или его подтипа.

Следующие функции доступны для экземпляров [`set`](https://python-all.ru/3.0/library/stdtypes.html#set) или его подтипов, но не для экземпляров [`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset) или его подтипов.

**\[PySet\_Discard\]int `PySet_Discard`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*set*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*key*)**

Возвращает 1, если элемент найден и удалён, 0, если не найден (никаких действий не предпринимается), и -1, если произошла ошибка. Не возбуждает

[`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError)

для отсутствующих ключей. Возбуждает

[`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError)

, если

*ключ*

не хешируется. В отличие от метода Python

`discard()`

, эта функция не преобразует автоматически нехешируемые множества во временные frozenset. Возбуждает

`PyExc_SystemError`

, если

*set*

не является экземпляром

[`set`](https://python-all.ru/3.0/library/stdtypes.html#set)

или его подтипа.

**\[PySet\_Pop\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PySet_Pop`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*set*)**

*Возвращаемое значение: новая ссылка.*

Возвращает новую ссылку на произвольный объект из *множества* и удаляет объект из *множества*. В случае ошибки возвращает *NULL*. Вызывает [`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError), если множество пусто. Вызывает [`SystemError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SystemError), если *множество* не является экземпляром [`set`](https://python-all.ru/3.0/library/stdtypes.html#set) или его подтипа.

**\[PySet\_Clear\]int `PySet_Clear`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*set*)**

Очищает существующее множество от всех элементов.
