Python中元组与不可变集合的区别

67 投票
4 回答
34764 浏览
提问于 2025-04-17 13:16

我正在通过《快速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)),以及进行并集和交集操作。它们也不能包含重复的元素,就像它们可变的版本一样。

撰写回答