Python frozenset(set的不可变版本)
1年前 (2024-04-27)
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:
当的元素不需要改变时,我们可以使用 fronzenset 替代 set,这样更加安全。
有时候程序要求必须是不可变对象,这个时候也要使用 fronzenset 替代 set。比如,字典(dict)的键(key)就要求是不可变对象。
下面程序演示了 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 是可变的。