Ответ
Уникальность элементов в set в Python обеспечивается его внутренней реализацией на основе хеш-таблицы. Процесс добавления элемента выглядит так:
-
Вычисление хеша. Для добавляемого элемента вызывается метод
__hash__()для получения его хеш-значения. Объекты с одинаковым содержимым должны возвращать одинаковый хеш. -
Поиск в хеш-таблице. На основе хеша определяется «корзина» (bucket), где должен храниться элемент.
-
Проверка на равенство. Если в корзине уже есть элементы (из-за коллизий хешей), Python сравнивает добавляемый элемент с каждым из них с помощью метода
__eq__(). Если находится равный элемент, новый не добавляется.
Этот механизм гарантирует, что в множестве не может быть двух равных друг другу элементов.
Пример:
# Создаем множество
my_set = {1, 'hello', 3.14}
# Попытка добавить существующий элемент
my_set.add('hello')
# Попытка добавить элемент, который считается равным (1 == 1.0)
my_set.add(1.0)
print(my_set) # Вывод: {1, 3.14, 'hello'}
# Размер множества не изменился, дубликаты не были добавлены.
Важно: Для корректной работы с пользовательскими объектами в множестве необходимо, чтобы в их классе были правильно реализованы методы __hash__ и __eq__.