Python 内建函数列表 > Python 的内置函数 frozenset
def frozenset(x):
'''
类型转换为 frozenset
:param x: 一个变量
:return: 转换为 frozenset 后的值
'''
Python 的内置函数 frozenset 用于创建一个不可变的集合对象,它继承了普通集合(set)的所有特性,如无序性、元素唯一性等,但关键区别在于 frozenset 一旦创建就不能被修改,因此它是可哈希的(hashable)。这使得 frozenset 可以作为字典的键或其他集合的元素,而普通的可变集合(set)则不具备这种能力。
不可变性:与 set 不同,frozenset 不能通过 add()、remove() 等方法修改其内容。尝试修改会引发 AttributeError。
可哈希性:由于不可变,frozenset 可哈希,可以作为字典的键或另一个集合的元素。例如:
fs = frozenset([1, 2, 3])
d = {fs: "value"} # 合法操作
支持集合操作:frozenset 支持所有集合操作,如并集(|)、交集(&)、差集(-)等,但这些操作会返回新的 frozenset 对象而非修改原对象。
通过 frozenset() 构造函数创建,参数可以是任何可迭代对象(如列表、元组、字符串等)。若未提供参数,则返回空 frozenset。
fs1 = frozenset([1, 2, 3]) # 从列表创建
fs2 = frozenset("hello") # 从字符串创建(元素为字符)
fs3 = frozenset() # 空 frozenset
字典的键:当需要集合作为键时,必须使用 frozenset。
graph = {
frozenset(["A", "B"]): 10,
frozenset(["B", "C"]): 5,
}
集合的元素:嵌套集合时,内部集合必须是 frozenset。
s = {frozenset([1, 2]), frozenset([3, 4])}
数据去重与缓存:在需要缓存集合结果或确保数据不可篡改的场景中使用。
# 可变集合(set)的局限性
s = {1, 2}
d = {s: "error"} # TypeError: unhashable type: 'set'
# 使用 frozenset 解决
fs = frozenset(s)
d = {fs: "valid"} # 成功
frozenset 的出现丰富了集合的应用场景frozenset ,尤其是在需要不可变性和可哈希性的场景中。
frozenset是 Python 中不可变集合的实现,它的存在大大扩展了集合的应用范围。与普通 set 相比,frozenset 具有以下几个重要特点和优势:
作为字典键:由于 frozenset 是不可变的,它可以被用作字典的键,而普通 set 则不行。这在需要建立集合到值的映射时特别有用。
valid = frozenset(['name', 'age'])
data = {valid: 'user_info'}
集合元素:frozenset 可以作为其他集合的元素,而普通 set 不能。
s = {frozenset([1,2]), frozenset([3,4])}
缓存优化:由于 frozenset 不可变,可以安全地进行缓存和重用,提高性能。
线程安全:在多线程环境中,frozenset 的不可变性保证了线程安全。
数学运算:在需要进行集合运算但又不希望原始集合被修改的场景下,frozenset 是完美的选择。
数据验证:可以用作常量集合来验证数据,确保集合内容不会被意外修改。
frozenset 支持所有集合的操作(如 union、intersection 等),但不会修改自身,而是返回新的 frozenset 对象。这一特性使其在函数式编程范式下特别有价值。