← Назад к вопросам

Почему для множества не используются фигурные скобки в Python?

1.3 Junior🔥 171 комментариев
#Асинхронность и многопоточность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Почему для множества не используются фигурные скобки в Python?

Краткий ответ

Фигурные скобки {} в Python используются для словарей (dictionaries), а не для множеств (sets). Это историческое решение, основанное на том, что словари появились раньше множеств в языке. Пустое множество создаётся через set(), а непустое может использовать синтаксис {1, 2, 3}.

Историческая справка

Python 1.x и 2.x

В ранних версиях Python:

  • Словари появились первыми и получили синтаксис {}
  • Множества были добавлены позже (Python 2.4) в виде функции set()

К тому времени синтаксис {} был уже закреплён за словарями, и изменить это было бы несовместимо с существующим кодом.

Различие между пустым словарём и пустым множеством

Это создало интересную ситуацию:

# {} — пустой словарь, не пустое множество!
empty_dict = {}
print(type(empty_dict))  # <class dict>

# Для пустого множества нужно использовать set()
empty_set = set()
print(type(empty_set))   # <class set>

# Непустое множество может использовать скобки
my_set = {1, 2, 3}
print(type(my_set))      # <class set>

Это может вызвать путаницу для новичков!

Синтаксис создания множеств

Способ 1: Синтаксис с кодовыми скобками (Python 2.7+)

# Непустое множество
my_set = {1, 2, 3, 4, 5}
print(my_set)  # {1, 2, 3, 4, 5}

# Множество строк
colors = {"red", "green", "blue"}
print(colors)  # {red, blue, green}

Способ 2: Конструктор set()

# Пустое множество
empty_set = set()

# Множество из списка
my_set = set([1, 2, 2, 3])  # Автоматически удаляет дубликаты
print(my_set)  # {1, 2, 3}

# Множество из строки
chars = set("hello")
print(chars)  # {h, e, l, o}

Почему это проблема? Таблица сравнения

СтруктураПустаяНепустаяСинтаксис
Словарь{}{"a": 1}Последовательный
Множествоset(){1, 2, 3}Несогласованный
Список[][1, 2, 3]Последовательный
Кортеж()(1, 2, 3)Последовательный

Практические примеры

Проверка наличия элемента

# Множество для быстрого поиска O(1)
allowed_users = {"alice", "bob", "charlie"}

def has_access(username: str) -> bool:
    return username in allowed_users

print(has_access("alice"))   # True
print(has_access("david"))   # False

Удаление дубликатов

data = [1, 2, 2, 3, 3, 3, 4]
unique = list(set(data))
print(unique)  # [1, 2, 3, 4] (порядок может отличаться)

# Или с сохранением порядка
unique_ordered = list(dict.fromkeys(data))
print(unique_ordered)  # [1, 2, 3, 4]

Операции с множествами

set_a = {1, 2, 3}
set_b = {2, 3, 4}

# Объединение
print(set_a | set_b)  # {1, 2, 3, 4}

# Пересечение
print(set_a & set_b)  # {2, 3}

# Разность
print(set_a - set_b)  # {1}

# Симметричная разность
print(set_a ^ set_b)  # {1, 4}

Почему это решение было сохранено?

1. Обратная совместимость

Изменение синтаксиса {} на множества сломало бы весь существующий код, использующий словари.

2. Частота использования

Словари используются намного чаще, чем множества, поэтому имеет смысл дать им более удобный синтаксис.

3. Семантика фигурных скобок

Фигурные скобки часто ассоциируются со словарями (ключ-значение пары), что логично.

Современный подход (Python 3.9+)

Новые синтаксисы типов используют set[int] вместо Set[int] из typing:

from typing import Set as OldSet  # Старый способ

# Новый способ (Python 3.9+)
my_set: set[int] = {1, 2, 3}
my_dict: dict[str, int] = {"a": 1}

Выводы

  • {} зарезервирован для словарей с момента создания Python
  • set() используется для пустого множества
  • {1, 2, 3} используется для непустого множества (работает, потому что нет ключей)
  • Это историческое решение сохранено для совместимости
  • Несмотря на синтаксическую асимметрию, это редко вызывает проблемы на практике