Python中frozenset,秒变不可变集合,再也不用担心多线程了!

news2024/11/25 14:53:37

目录

1、Frozenset基础介绍 🌐

1.1 Frozenset定义与创建

1.2 不可变集合特性

1.3 与Set的区别对比

2、Frozenset操作实践 🧩

2.1 初始化与添加元素尝试

2.2 成员测试: in & not in

2.3 集合运算: 并集、交集、差集

2.4 使用场景示例: 字典键、函数参数默认值

2.5 frozenset转换技巧

3、Frozenset进阶应用 🔍

3.1 Hashable特性与字典键优化

3.2 并发安全与多线程环境

3.3 序列化与数据交换安全

4、性能考量与最佳实践 ⏱️

4.1 Frozenset内存占用分析

4.2 操作效率比较

4.3 适用场景讨论

5、实战演练:Frozenset解决实际问题 🎯

5.1 数据库去重索引构建

5.2 并发编程数据同步

5.3 JSON序列化特殊处理

6、总结与展望 🚀



1、Frozenset基础介绍 🌐

1.1 Frozenset定义与创建

在Python中,frozenset是一种不可变的集合数据类型 ,意味着一旦创建,其内容就不能被修改。它继承了集合(set)的所有特性,如无序性、唯一性,但不具备添加或删除元素的能力。创建frozenset可以通过直接将一个可迭代对象传递给frozenset()构造函数来完成。

# 创建frozenset实例
immutable_set = frozenset([1, 2, 3])
print(immutable_set)  # 输出: frozenset({1, 2, 3})

1.2 不可变集合特性

由于frozenset的不可变性,它成为了哈希表的理想键值类型 ,因为哈希表的键要求是不可变且可哈希的。这意味着你可以将frozenset用作字典的键,而普通的set则不行。

# 使用frozenset作为字典键
dict_example = {frozenset([1, 2]): 'Tuple', frozenset(['a', 'b']): 'List'}
print(dict_example[frozenset([1, 2])])  # 输出: Tuple

1.3 与Set的区别对比

尽管frozensetset在功能上相似,但它们的主要区别在于可变性:

  • Set:是可变集合,允许添加(add)、删除(remove)元素以及执行其他修改操作。

  • Frozenset:是不可变集合,不支持任何改变其内容的操作,但支持集合运算如并集(union)、交集(intersection)等,并且可以被用作字典的键或作为集合成员。

通过下面的例子,可以直观地看到两者的差异:

mutable_set = set([1, 2, 3])
mutable_set.add(4)  # 合法操作
print(mutable_set)  # 输出: {1, 2, 3, 4}

try:
    immutable_set.add(4)  # 这会引发TypeError
except AttributeError as e:
    print(e)  # 输出: 'frozenset' object has no attribute 'add'

通过上述内容,我们深入探讨了frozenset的基本概念、其不可变性特质以及与常规set的区别,为理解和运用这一数据结构奠定了坚实的基础。接下来的章节将进一步探索其高级应用与性能考量。

2、Frozenset操作实践 🧩

2.1 初始化与添加元素尝试

虽然frozenset不允许添加或删除元素,我们可以通过创建新的frozenset来模拟添加或移除元素的效果。首先,让我们尝试初始化一个frozenset并观察当尝试修改时会发生什么。

# 初始化frozenset
my_frozenset = frozenset([1, 2, 3])
print(my_frozenset)  # 输出: frozenset({1, 2, 3})

# 尝试添加元素,这将失败
try:
    my_frozenset.add(4)
except AttributeError as e:
    print("错误:", e)  # 输出: 错误: 'frozenset' object has no attribute 'add'

2.2 成员测试: in & not in

frozenset支持快速的成员测试,这对于判断一个元素是否存在于集合中非常有用。

# 成员测试
print(2 in my_frozenset)  # 输出: True
print(4 not in my_frozenset)  # 输出: True

2.3 集合运算: 并集、交集、差集

frozenset支持标准的集合运算,包括并集(union)、交集(intersection)和差集(difference)。

another_set = frozenset([3, 4, 5])

# 并集
union_result = my_frozenset.union(another_set)
print(union_result)  # 输出: frozens

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1898064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DisFormer:提高视觉动态预测的准确性和泛化能力

最新的研究进展已经显示出目标中心的表示方法在视觉动态预测任务中可以显著提升预测精度,并且增加模型的可解释性。这种表示方法通过将视觉场景分解为独立的对象,有助于模型更好地理解和预测场景中的变化。 尽管在静态图像的解耦表示学习方面已经取得了一…

聊天交友系统开发专业语聊交友app开发搭建同城交友开发婚恋交友系统相亲app开发

1、上麦相亲互动:直播间内除了红娘外,还有男女用户两个视频麦位,直播间符合要求的用户可以申请上麦 2、公屏聊天:为上麦用户可以通过在公屏发言的方式参与直播间内的话题互动。 3、私信,异性用户之间可以发送私信消息,通过付费或开通会员可解…

Spring 6.1.10版本源码编译

每篇一句 我们对时间的感知其实非常主观,我们越习惯于我们的生活方式,生活里面的新鲜感就越少,我们对时间 的感知就越快,生命就越短。 1.源码下载 进入Spring官网 https://spring.io/ 按照上图步骤进入如下Spring Framework链…

通过RpmBuild构建redis-5.0.9版本的RPM类型包

系列文章目录 rpmbuild基础知识 文章目录 系列文章目录前言一、rpmbuild相关操作1、安装rpmbuild命令2、安装spec文件检查工具3、查看rpmbuild版本4、编译工具安装5、修改rpm制作包的默认路径 二、资源准备1、创建rpmbuild工作目录2、目录作用解释3、下载redis源码包4、上传re…

LLM - 神经网络的组成

1. 一个神经元的结构:即接受多个输入X向量,在一个权重向量W和一个偏执标量b的作用下,经过激活函数后,产生一个输出。 2. 一层神经网络的结构:该层网络里的每个神经元并行计算,得到各自的输出;计算方式是输入…

Go源码--channel源码解读

简介 channel顾名思义就是channel的意思,主要用来在协程之间传递数据,所以是并发安全的。其实现原理,其实就是一个共享内存再加上锁,底层阻塞机制使用的是GMP模型。可见 GMP模型就是那个道,道生一,一生二,二生三,三生…

【Spring Boot】统一数据返回

目录 统一数据返回一. 概念二.实现统一数据返回2.1 重写responseAdvice方法2.2 重写beforeBodyWriter方法 三. 特殊类型-String的处理四. 全部代码 统一数据返回 一. 概念 其实统一数据返回是运用了AOP(对某一类事情的集中处理)的思维,简单…

UML2.0-系统架构师(二十四)

1、(重点)系统()在规定时间内和规定条件下能有效实现规定功能的能力。它不仅取决于规定的使用条件等因素,还与设计技术有关。 A可靠性 B可用性 C可测试性 D可理解性 解析: 可靠性:规定时间…

在Linux操作系统中关于逻辑卷的案例

1.如何去创建一个逻辑卷 1.1先去创建物理卷 如上图所示,physical volume 物理卷 被成功创建。 如上图所示,可以使用pvscan来去查看当前Linux操作系统的物理卷/ 1.2使用创建好的物理卷去创建一个卷组。 如上图所示,可以使用第一步创建的两个…

点亮led灯——Arduino uno R3 学习之旅

​ 常识: 一般智能手机的额定工作电流大约为200mA Arduino Uno板上I/0(输入/输出)引脚最大输出电流为40 mA Uno板控制器总的输出电流为200 mA 发光二极管介绍 发光二极管(Light Emitting Diode,简称LED)是一种能够将电能转化为光能的固态的半导体器件。 LED的极…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥导入介绍及算法规格】

密钥导入介绍及算法规格 如果业务在HUKS外部生成密钥(比如应用间协商生成、服务器端生成),业务可以将密钥导入到HUKS中由HUKS进行管理。密钥一旦导入到HUKS中,在密钥的生命周期内,其明文仅在安全环境中进行访问操作&a…

输入框输入值之后,检索表格中是否存在输入框中的值,存在就让当前文字为红色

this.searchValue为输入框的值 createKeywordHtml_content(data) { if (data undefined) { return data; } if (typeof data ! string) { data String(data) } let value data.replace(this.searchValue, <span style"color:#FF5555">$&</span>…

Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题

目录 Vue优化路径 一、使用key 二、使用冻结对象 三、使用函数式组件 四、使用计算属性 五、使用非实时绑定的表单项 六、保持对象引用稳定 6.1、保持对象引用稳定定义 6.2、保持对象引用稳定与不稳定的例子 6.3、vue2判断数据是否变化是通过hasChanged函数实现的 ①…

2024年软件测试岗必问的100+个面试题【含答案】

一、基础理论 1、开场介绍 介绍要领&#xff1a;个人基本信息、工作经历、之前所做过的工作及个人专长或者技能优势。扬长避短&#xff0c;一定要口语化&#xff0c;语速适中。沟通好的就多说几句&#xff0c;沟通不好的话就尽量少说两句。举例如下&#xff1a; 面试官你好&…

ONLYOFFICE 8.1版本震撼来袭,让办公更高效、更智能

官网链接&#xff1a; 在线PDF查看器和转换器 | ONLYOFFICE 在线办公套件 | ONLYOFFICE 随着科技的不断发展&#xff0c;办公软件已经成为现代企业提高工作效率、实现信息共享的重要工具。在我国&#xff0c;一款名为ONLYOFFICE的在线办公套件受到了越来越多企业的青睐。今天…

3086.力扣每日一题7/4 Java

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 首先通过循环计…

AI大模型对话(上下文)缓存能力

互联网应用中&#xff0c;为了提高数据获取的即时性&#xff0c;产生了各种分布式缓存组件&#xff0c;比如Redis、Memcached等等。 大模型时代&#xff0c;除非是免费模型&#xff0c;否则每次对话都会花费金钱来进行对话&#xff0c;对话是不是也可以参照缓存的做法来提高命…

ASUS/华硕飞行堡垒8 FX506L FX706L系列 原厂win10系统 工厂文件 带F12 ASUS Recovery恢复

华硕工厂文件恢复系统 &#xff0c;安装结束后带隐藏分区&#xff0c;一键恢复&#xff0c;以及机器所有驱动软件。 系统版本&#xff1a;Windows10 原厂系统下载网址&#xff1a;http://www.bioxt.cn 需准备一个20G以上u盘进行恢复 请注意&#xff1a;仅支持以上型号专用…

大量设备如何集中远程运维?用好向日葵的这几个功能很重要

当企业的业务不断发展&#xff0c;不同系统、不同用途的IT设备数量也会不断上升&#xff0c;面对不断扩张的设备规模&#xff0c;IT运维的压力自然也会陡然上升。 面对这种情况&#xff0c;传统的线下运维方式已经不再合适&#xff0c;我们需要引入一个专业的&#xff0c;可以…

Spring Boot集成jacoco实现单元测试覆盖统计

1.什么是jacoco&#xff1f; JaCoCo&#xff0c;即 Java Code Coverage&#xff0c;是一款开源的 Java 代码覆盖率统计工具。支持 Ant 、Maven、Gradle 等构建工具&#xff0c;支持 Jenkins、Sonar 等持续集成工具&#xff0c;支持 Java Agent 技术远程监控 Java 程序运行情况…