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

---

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

Новое в версии 2.5.

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

**`PySetObject`**

Этот подтип

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

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

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

, так и для

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

. Он подобен

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

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

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

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

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

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

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

языка Python.

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

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

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

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

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

языка Python.

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

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

Возвращает true, если *p* является объектом [`set`](https://python-all.ru/2.6/library/stdtypes.html#set) или экземпляром подтипа.

Новое в версии 2.6.

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

Возвращает true, если *p* является объектом [`frozenset`](https://python-all.ru/2.6/library/stdtypes.html#frozenset) или экземпляром подтипа.

Новое в версии 2.6.

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

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

*p*

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

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

, объектом

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

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

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

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

*p*

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

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

или объектом

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

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

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

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

*p*

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

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

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

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

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

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

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

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

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

Изменено в версии 2.6: Теперь гарантированно возвращает новый [`frozenset`](https://python-all.ru/2.6/library/stdtypes.html#frozenset). Ранее frozenset нулевой длины был синглетоном. Это мешало построению новых frozenset с помощью [`PySet_Add()`](https://python-all.ru/2.6/c-api/set.html#PySet_Add).

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

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

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

Изменено в версии 2.5: Эта функция возвращала `int`. Это может потребовать изменений в вашем коде для корректной поддержки 64-разрядных систем.

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

Макроформа

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

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

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

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

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

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

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

, если

*key*

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

`PyExc_SystemError`

, если

*anyset*

не является

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

,

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

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

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

Добавляет *key* в экземпляр [`set`](https://python-all.ru/2.6/library/stdtypes.html#set). Не применяется к экземплярам [`frozenset`](https://python-all.ru/2.6/library/stdtypes.html#frozenset) . Возвращает 0 при успехе или -1 при ошибке. Вызывает [`TypeError`](https://python-all.ru/2.6/library/exceptions.html#exceptions.TypeError), если *key* нехешируем. Вызывает [`MemoryError`](https://python-all.ru/2.6/library/exceptions.html#exceptions.MemoryError), если недостаточно места для расширения. Вызывает [`SystemError`](https://python-all.ru/2.6/library/exceptions.html#exceptions.SystemError), если *set* не является экземпляром [`set`](https://python-all.ru/2.6/library/stdtypes.html#set) или его подтипа.

Изменено в версии 2.6: Теперь работает с экземплярами [`frozenset`](https://python-all.ru/2.6/library/stdtypes.html#frozenset) или его подтипов. Подобно [`PyTuple_SetItem()`](https://python-all.ru/2.6/c-api/tuple.html#PyTuple_SetItem), эту функцию можно использовать для заполнения значений новых frozenset до того, как они станут доступны другому коду.

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

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

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

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

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

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

, если

*ключ*

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

`discard()`

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

`PyExc_SystemError`

, если

*set*

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

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

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

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

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

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

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

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