Вы не можете добавить список в набор, потому что списки изменчивы, это означает, что вы можете изменить содержимое списка после добавления его в набор.
Однако вы можете добавить кортежи к набору, потому что вы не можете изменить содержимое кортежа:
>>> a.add(('f', 'g'))
>>> print a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])
Редактировать : некоторые пояснения: документация определяет set
как неупорядоченную коллекцию различных хешируемых объектов. Объекты должны быть хешируемыми, чтобы поиск, добавление и удаление элементов можно было выполнять быстрее, чем просмотр каждого отдельного элемента каждый раз, когда вы выполняете эти операции. Конкретные алгоритмы описаны в статье в Википедии . Алгоритмы хеширования Pythons описаны на effbot.org и __hash__
функции pythons в справочнике по python .
Некоторые факты:
- Элементы набора, а также ключи словаря должны быть хэшируемыми
- Некоторые небрежные типы данных:
list
: используйте tuple
вместо
set
: используйте frozenset
вместо
dict
: не имеет официального аналога, но есть некоторые
рецепты
- По умолчанию экземпляры объектов могут быть хэшируемыми, каждый экземпляр имеет уникальный хэш. Вы можете переопределить это поведение, как описано в ссылке на Python.