Python中元组与不可变集合的区别
我正在通过《快速Python书》学习Python 3,书中提到了一种叫做“冻结集合”的东西。作者说,普通的集合是可变的,也就是说它们的内容可以改变,所以它们不能用作字典的键。为了弥补这个问题,出现了“冻结集合”。除了明显的区别:元组是有序的数据结构,而冻结集合(或者更一般的集合)是无序的,元组和冻结集合之间还有其他区别吗?
4 个回答
7
一个让我想到的区别是关于重复元素的问题。比如说,一个元组 (1, 1, 1, 1, 2, 2, 2)
会保留所有的重复值,正如你所期待的那样。但是,如果用一个不可变集合(frozenset),它会把所有的重复值都去掉,最后只剩下 frozenset([1, 2])
。
14
这段话有点反直觉,看看这个有趣的说法:
sss = frozenset('abc')
sss |= set('efg')
执行后会得到:
frozenset(['a', 'c', 'b', 'e', 'g', 'f'])
当然,这其实和 x = x | y 是一样的,所以并没有改变原来的 frozenset,但对代码审查的人来说,这样的写法真是让“不可变”这个词显得有点滑稽!
112
元组
是不可变的列表
,而冻结集合
是不可变的集合
。
元组
确实是一个有序的对象集合,但它可以包含重复的元素和无法被哈希的对象,并且支持切片功能。
冻结集合
没有索引,但它具备集合
的一些功能,比如可以快速查找元素(时间复杂度为O(1)),以及进行并集和交集操作。它们也不能包含重复的元素,就像它们可变的版本一样。