Обратите внимание, что в сообщении об ошибке написано «нехешируемый тип: 'список'». Это отличается от неизменяемого и изменяемого. Давайте посмотрим на более простой пример, который вызывает ту же ошибку:
>>> s = set()
>>> s.add(1)
>>> s.add([2, 3])
>>> s
{1}
>>> s.add((2, 3))
>>> s
{(2, 3), 1}
>>> s.add([2, 3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>>
Итак, здесь мы видим, что мы можем добавить целое число 1
в набор, но не список [2, 3]
, потому что список не хэшируемый. . Это связано с тем, как set хранит и извлекает значения. Класс set
требует, чтобы он мог вызывать hash()
для своих элементов.
Теперь ваша версия:
>>>s = set([1,(2,3)]) #OK 1
>>>s
{1,(2.3)} # Note: the output in your original question has an extra set of parentheses
Когда вы вызываете set()
таким образом, он добавляет элементы данный список в набор. Конечный результат такой же, как при вызове add()
для каждого элемента.
Теперь, если мы попробуем:
>>>s = set([1,[2,3]])
Мы не должны удивляться ошибке, потому что мы пытаемся добавить список к набору.