Python中元组和frozensets之间的区别

leg*_*s2k 46 python tuples set data-structures

我正在使用The Quick Python Book学习Python 3,其中作者讨论了frozensets,声明由于集合是可变的,因此不可删除,从而变得不适合成为字典键,因此引入了它们的冻结对应物.除了元组是有序数据结构的明显差异,而冻结集,或更一般地说是集合,是无序的,元组和冻结集之间是否还有其他差异?

Vol*_*ity 74

tuples是不可变的lists,frozensets是不可改变的sets.

tuples 确实是一个有序的对象集合,但它们可以包含重复和不可用的对象,并具有切片功能

frozensets没有索引,但您具有sets- O(1)元素查找功能,以及联合和交叉点等功能.它们也不能包含重复项,就像它们的可变副本一样.


F1R*_*ors 11

有点反直觉 - 这个怎么样:

sss = frozenset('abc')
sss |= set('efg')
Run Code Online (Sandbox Code Playgroud)

将产量:

frozenset(['a', 'c', 'b', 'e', 'g', 'f'])
Run Code Online (Sandbox Code Playgroud)

当然,这相当于x = x | y,所以不要改变原来的冷冻集,但它并不是对代码审查者的"不可变"一词的嘲弄!

  • 不可变并不意味着你不能重用变量名!如果你运行`id(sss)`,你会看到第一个`sss`变量代表一个不同于第二个`sss`变量的对象.(不可变的str对象以相同的方式工作.) (6认同)

Mak*_*oto 6

想到的一个区别是重复问题.一个元组(1, 1, 1, 1, 2, 2, 2)将完全符合您的预期,但是一个冻结组将删除所有这些重复项,让您随意frozenset([1, 2]).


Joo*_*oop 5

波动性确实提到了冻结没有编入索引.我在看其他功能,所以没有立即意识到标准的python切片是不可能的.

a = frozenset((1, 1, 1, 1, 2, 2, 2))  # results in frozenset([1, 2])
print a[0] 
Run Code Online (Sandbox Code Playgroud)

会给出错误:

TypeError: 'frozenset' object does not support indexing
Run Code Online (Sandbox Code Playgroud)

很明显它没有编入索引,但是值得在这里明确添加