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

Какие объекты могут быть в Python множестве?

2.0 Middle🔥 91 комментариев

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

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

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

Какие объекты могут быть в Python множестве

Множество (set) в Python — это неупорядоченная коллекция уникальных элементов. Не все объекты могут находиться в множестве — только хешируемые (hashable) объекты.

Что такое хешируемость?

Объект хешируем, если:

  1. Имеет метод hash(), возвращающий целое число
  2. Может быть сравнен на равенство через eq()
  3. Неизменяемый (immutable) — не меняется в течение жизни

Это необходимо, потому что множество использует хеш для быстрого поиска элементов.

Объекты, которые МОГУТ быть в множестве

1. Числа (int, float, complex)

number_set = {1, 2, 3, 1.5, 2.5}
print(hash(42))

2. Строки (str)

string_set = {"hello", "world", "python"}
print(hash("hello"))

3. Кортежи (tuple)

Только если содержат хешируемые элементы:

tuple_set = {(1, 2), (3, 4), (1, "hello")}
print(tuple_set)

4. Булевы значения и None

bool_set = {True, False, None}
none_set = {None, 1, 2}

5. frozenset

fs1 = frozenset({1, 2, 3})
fs2 = frozenset({4, 5, 6})
frozen_set = {fs1, fs2}

6. Bytes

bytes_set = {b"hello", b"world"}

7. Пользовательские объекты с hash

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __hash__(self):
        return hash((self.x, self.y))
    
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

point_set = {Point(1, 2), Point(3, 4)}

Объекты, которые НЕ могут быть в множестве

1. Списки (list)

my_list = [1, 2, 3]
my_list[0] = 100  # изменяемый - нельзя в множество

2. Словари (dict)

my_dict = {"a": 1}
my_dict["b"] = 2  # изменяемый - нельзя в множество

3. Множества (set)

my_set = {1, 2, 3}
my_set.add(4)  # изменяемый - нельзя в множество

print({frozenset({1, 2, 3})})  # OK - используйте frozenset

4. Байтовые массивы (bytearray)

ba = bytearray(b"hello")
ba[0] = 72  # изменяемый - нельзя в множество

Проверка хешируемости

def is_hashable(obj):
    try:
        hash(obj)
        return True
    except TypeError:
        return False

print(is_hashable(1))
print(is_hashable([1, 2]))
print(is_hashable((1, 2)))

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

# Удаление дубликатов
original = [1, 2, 2, 3, 3, 3, 4]
unique = list(set(original))

# Пересечение списков
list1 = [1, 2, 3, 4]
list2 = [3, 4, 5, 6]
intersection = set(list1) & set(list2)

# Кортежи как элементы множества
coordinates = {(0, 0), (1, 1), (2, 2)}
for x, y in coordinates:
    print(f"Координата: {x}, {y}")

Резюме

МОГУТ быть в множестве: int, float, str, bool, None, bytes, tuple, frozenset, пользовательские объекты с hash()

НЕ МОГУТ быть: list, dict, set, bytearray, пользовательские объекты без hash()

Ключевой принцип: в множество можно поместить только неизменяемые объекты, которые имеют хеш и не меняются во время жизни программы.