J'apprends Python 3 en utilisant The Quick Python Book, où l'auteur parle de frozensets, déclarant que puisque les ensembles sont mutables et donc inchangeables, devenant ainsi impropres à la vie) pour être des clés de dictionnaire, leurs homologues figés ont été introduits. À part la différence évidente qu'un tuple est une structure de données ordonnée alors que frozenset, ou plus généralement un ensemble, n'est pas ordonné, existe-t-il d'autres différences entre un tuple et un frozenset?
tuples
sont immuables lists
, frozensets
sont immuables sets
.
tuples
sont en effet une collection ordonnée d'objets, mais ils peuvent contenir des doublons et des objets non partageables, et ont une fonctionnalité de tranche
frozensets
ne sont pas indexés, mais vous avez la fonctionnalité de sets
- O(1) recherche d'élément, et des fonctionnalités telles que les unions et les intersections. Ils ont également ne peut pas contenir de doublons, comme leurs homologues mutables.
Un peu contre-intuitif - qu'en est-il de ce bon mot:
sss = frozenset('abc')
sss |= set('efg')
Donnera:
frozenset(['a', 'c', 'b', 'e', 'g', 'f'])
Bien sûr, cela équivaut à x = x | y, donc ne changez pas le frozenset d'origine, mais cela ne fait pas à moitié ridicule du terme "immuable" pour le réviseur de code!
Une différence qui me vient à l'esprit est la question des doublons. Un tuple de (1, 1, 1, 1, 2, 2, 2)
Serait exactement ce à quoi vous vous attendez, mais un ensemble de frozens supprimerait tous ces doublons, vous laissant avec frozenset([1, 2])
.
La volatilité mentionne que les frozensets ne sont pas indexés. Je regardais les autres fonctionnalités, donc je n'ai pas immédiatement réalisé que le découpage standard python n'est pas possible.
a = frozenset((1, 1, 1, 1, 2, 2, 2)) # results in frozenset([1, 2])
print a[0]
donnera une erreur:
TypeError: 'frozenset' object does not support indexing
Évident du fait qu'il n'est pas indexé, mais bien qu'il valait la peine d'ajouter explicitement ici