其他的数字类型——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
发起讨论 只看当前版本


暂无话题~