Первое выражение вызовет TypeError: списки не хешируются и не могут быть элементами set. Второе допустимо, потому что одноэлементные кортежи из целых чисел хешируемы.
Работа со множествами, содержащими вложенные коллекции
Первое выражение вызовет TypeError: списки не хешируются и не могут быть элементами set. Второе допустимо, потому что одноэлементные кортежи из целых чисел хешируемы.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, возникнет ли ошибка при выполнении приведённых ниже выражений, и объясните, почему во втором примере используются запятые.
s = set([[1], [2]])
s2 = set([(1,), (2,)])
Ответ
Первое выражение вызовет TypeError: списки не хешируются и не могут быть элементами set. Второе допустимо, потому что одноэлементные кортежи из целых чисел хешируемы.
Запятая создаёт кортеж: (1,) — tuple, а (1) — просто число 1. Поэтому отдельно выполненное второе выражение даст множество {(1,), (2,)} с неопределённым порядком отображения.
В одном последовательном скрипте до s2 выполнение не дойдёт, если ошибка первой строки не перехвачена. Кортеж хешируем не всегда: содержащий список кортеж тоже нельзя добавить в set. Все его элементы должны поддерживать корректный хеш.