Я изучаю Python 3, используя книгу Quick Python, в которой автор говорит о фризонсеттах, заявляя, что, поскольку наборы являются изменяемыми и, следовательно, нераспространяющимися, тем самым становятся непригодными для словарных ключей, их замороженные копии были введены. Помимо очевидного различия в том, что кортеж представляет собой упорядоченную структуру данных, в то время как frozenset, или, в более общем случае, набор, неупорядочен, существуют ли какие-либо другие различия между кортежем и фризонсетом?
Разница между кортежами и фризонсетцами в Python
Ответ 1
tuples
являются неизменяемыми lists
, frozensets
являются неизменяемыми sets
.
tuples
- это действительно упорядоченный набор объектов, но они могут содержать дубликаты и не подлежащие удалению объекты и иметь функцию среза
frozensets
не индексируются, но у вас есть функциональные возможности поиска sets
- O (1), а также такие функции, как объединения и пересечения. Они также не могут содержать дубликаты, например, их изменяемые копии.
Ответ 2
Несколько противник интуитивно понятен - как насчет этого bon mot:
sss = frozenset('abc')
sss |= set('efg')
Уступит:
frozenset(['a', 'c', 'b', 'e', 'g', 'f'])
Конечно, это эквивалентно x = x | y, поэтому не изменяя первоначальный фризонсет, но он не издает насмешки над термином "неизменяемый" для рецензента кода!
Ответ 3
Одна разница, которая приходит на ум, - это проблема дубликатов. Кортеж (1, 1, 1, 1, 2, 2, 2)
будет именно тем, что вы ожидаете, но frozenset удалит все эти дубликаты, оставив вас с frozenset([1, 2])
.
Ответ 4
Волатильность упоминает, что фризонсет не индексируется. Я смотрел на другие функции, поэтому не сразу понял, что стандартная нарезка python невозможна.
a = frozenset((1, 1, 1, 1, 2, 2, 2)) # results in frozenset([1, 2])
print a[0]
выдаст ошибку:
TypeError: 'frozenset' object does not support indexing
Очевидно, из-за того, что он не индексируется, но хотя здесь явно стоит добавить