其他的数字类型——Sets——不可变的限制和冻结的set
Set 是强大灵活的对象,但它们在3系列和2系列中都有一个应该牢记的限制——很大程度上因为它们的实现方法,set只能包含不可变(又名“可哈希”)的对象类型。因此,如果需要存储复合值,列表和字典不能被嵌入set,但元组可以。当用在set操作中时,元组通过完整值来比较:
>>> S
{1.23}
>>> S.add([1, 2, 3]) # 在set中只能包含不可变对象
TypeError: unhashable type: 'list'
>>> S.add({'a':1})
TypeError: unhashable type: 'dict'
>>> S.add((1, 2, 3))
>>> S # 列表和字典不行,但元组可以
{1.23, (1, 2, 3)}
>>> S | {(4, 5, 6), (1, 2, 3)} # 并集:同S.union(...)
{1.23, (4, 5, 6), (1, 2, 3)}
>>> (1, 2, 3) in S # 成员测试:通过完整值比较
True
>>> (1, 4, 3) in S
False
比如,在set中的元组,可能用来代表日期,记录,IP地址等等(关于更多关于元组的信息请参考本书这个部分的后面章节)。set还可能包含模块,类型对象等等。set自身也是可变的,因此不能被直接嵌套在其他set中;如果需要将set存储到另一个set中,可以使用frozenset
内置函数,它调用起来就像set
但创建一个不可变的set因此可以被嵌入其他set中。
推荐文章: