其他的数字类型——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 中。
推荐文章: