我正在使用《Python快速入门》学习Python 3,作者在书中谈到了frozenset,并指出由于set是可变的且因此不可哈希,从而不适合作为字典键,因此引入了它们的frozen版本。除了元组是有序数据结构而frozenset或更一般地说set是无序的明显区别之外,元组和frozenset之间还有其他区别吗?
我正在使用《Python快速入门》学习Python 3,作者在书中谈到了frozenset,并指出由于set是可变的且因此不可哈希,从而不适合作为字典键,因此引入了它们的frozen版本。除了元组是有序数据结构而frozenset或更一般地说set是无序的明显区别之外,元组和frozenset之间还有其他区别吗?
tuples
是不可变的lists
,frozensets
是不可变的sets
。
tuples
确实是有序对象的集合,但它们可以包含重复和不可哈希对象,并且具有切片功能。
frozensets
没有索引,但您可以使用sets
的功能- O(1)元素查找,以及诸如联合和交集等功能。它们也不能包含重复项,就像它们的可变对应项一样。
有些违反直觉 - 但这句机智的话怎么说:
sss = frozenset('abc')
sss |= set('efg')
将产生:
frozenset(['a', 'c', 'b', 'e', 'g', 'f'])
当然,这相当于 x = x | y,因此不会改变原始的 frozenset。但对于代码评审员来说,“immutable”这个术语似乎有些荒谬!sss = set('abc')
,它将执行相同的操作。 - Benid(sss)
,你会发现第一个sss
变量代表的对象与第二个sss
变量不同。(不可变的字符串对象也是同样的道理。) - dbn我想到的一个不同之处是重复问题。元组 (1, 1, 1, 1, 2, 2, 2)
将会和你期望的一模一样,但是一个frozenset将会移除所有重复的部分,只留下 frozenset([1, 2])
。
Volatility提到frozensets没有索引。我当时正在看其他功能,所以并没有立刻意识到标准的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
很明显它没有被索引,但是我认为值得在这里明确添加一下。
print iter(a).next()
这样的事情。 - F1Rumors
;)
- Volatilitytuple
和frozenset
是可哈希的;而list
和set
则不是。 - Elliot Cameron([],)
放入集合中)。但它们可以通过其他方式变为可哈希,而列表则始终不可哈希。 - Volatility