其他的数字类型——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 中。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~