set 集合是可變序列,程序可以改變序列中的元素;frozenset 集合是不可變序列,程序不能改變序列中的元素。set 集合中所有能改變集合本身的方法,比如 remove()、discard()、add() 等,frozenset 都不支持;set 集合中不改變集合本身的方法,fronzenset 都支持。
我們可以在交互式編程環境中輸入dir(frozenset)
來查看 frozenset 集合支持的方法:
>>> dir(frozenset)
['copy', 'difference', 'intersection', 'isdisjoint', 'issubset', 'issuperset', 'symmetric_difference', 'union']
frozenset 集合的這些方法和 set 集合中同名方法的功能是一樣的。
兩種情況下可以使用 fronzenset:
下面程序演示了 frozenset 的用法:
s = {
'Python', 'C', 'C++'}
fs = frozenset(['Java', 'Shell'])
s_sub = {
'PHP', 'C#'}
#向set集合中添加frozenset
s.add(fs)
print('s =', s)
#向為set集合添加子set集合
s.add(s_sub)
print('s =', s)
運行結果:
s = {
'Python', frozenset({
'Java', 'Shell'}), 'C', 'C++'}
Traceback (most recent call last):
File "C:\Users\mozhiyan\Desktop\demo.py", line 11, in <module>
s.add(s_sub)
TypeError: unhashable type: 'set'
需要注意的是,set 集合本身的元素必須是不可變的, 所以 set 的元素不能是 set,只能是 frozenset。第 6 行代碼向 set 中添加 frozenset 是沒問題的,因為 frozenset 是不可變的;但是,第 10 行代碼中嘗試向 set 中添加子 set,這是不允許的,因為 set 是可變的。