
Set 是强大灵活的对象，但它们在3系列和2系列中都有一个应该牢记的限制——很大程度上因为它们的实现方法，set只能包含*不可变*（又名“可哈希”）的对象类型。因此，如果需要存储复合值，列表和字典不能被嵌入set，但元组可以。当用在set操作中时，元组通过完整值来比较：

```py
>>> 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中。