新闻中心
怎么掌握python中weakref模块用法?
弱引用不增加引用计数,可被垃圾回收,用于避免循环引用和内存泄漏;通过weakref.ref()创建弱引用,WeakKeyDictionary和WeakValueDictionary实现自动清理的映射,WeakMethod用于安全绑定回调,适用于缓存、事件监听等场景。

掌握 Python 中 weakref 模块的关键在于理解弱引用与普通引用的区别,以及它在避免循环引用和节省内存方面的实际用途。弱引用不会增加对象的引用计数,因此不会阻止对象被垃圾回收。这在缓存、观察者模式或树形结构中特别有用。
什么是弱引用?
Python 默认使用强引用:只要有一个变量指向对象,该对象就不会被销毁。而弱引用允许你指向一个对象,但不阻止它被回收。
使用 weakref 创建的引用,在原对象被删除后会自动失效。
常见场景:- 缓存大量对象时,不想因为引用导致内存无法释放
- 父子对象互相引用,避免循环引用导致内存泄漏
- 实现回调机制或事件监听器,避免“僵尸”监听器占用内存
基本用法:创建弱引用
使用 weakref.ref() 可以创建一个弱引用对象。调用这个引用时返回原始对象,如果对象已被回收,则返回 None。
示例:import weakref
<p>class MyClass:
def <strong>init</strong>(self, name):
self.name = name
def <strong>del</strong>(self):
print(f"{self.name} 被删除")</p><p>obj = MyClass("test")
wref = weakref.ref(obj)</p><p>print(wref()) # 输出: <<strong>main</strong>.MyClass object at 0x...>
del obj # 删除强引用,触发 <strong>del</strong>
print(wref()) # 输出: None
常用工具类:WeakKeyDictionary 和 WeakValueDictionary
这两个容器是 weakref 模块中最实用的部分,适合用于映射关系且不希望影响对象生命周期。
WeakKeyDictionary:- 键必须是可弱引用的(通常是实例)
- 当某个键对象被回收,对应的条目会自动从字典中删除
- 适合用于给对象动态附加数据而不影响其生命周期
WeakValueDictionary:
GoEnhance
全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。
347
查看详情
- 值是弱引用
- 当值对象被回收,对应键值对自动清除
- 常用于实现缓存
示例:使用 WeakValueDictionary 做缓存
import weakref
<p>cache = weakref.WeakValueDictionary()</p><p>class CachedObject:
def <strong>init</strong>(self, name):
self.name = name</p><p>def get_object(name):
obj = cache.get(name)
if obj is None:
obj = CachedObject(name)
cache[name] = obj
print(f"创建新对象: {name}")
return obj</p><p>a = get_object("A")
b = get_object("B")
c = get_object("A") # 应该命中缓存
print(a is c) # True</p><p>del a, c</p><h1>此时 "A" 的对象可能被回收</h1><p>d = get_object("A") # 会重新创建
print(d.name) # 创建新对象: A
绑定方法和回调:使用 weakref.WeakMethod
如果你需要弱引用一个对象的方法(比如注册回调),直接用 ref 会保留整个实例,导致无法回收。这时应该用 WeakMethod。
示例:import weakref
<p>class Listener:
def on_event(self):
print("收到事件")</p><p>listener = Listener()
callback = weakref.WeakMethod(listener.on_event)</p><p>method_ref = callback()
if method_ref:
method_ref() # 调用方法</p><p>del listener
method_ref = callback() # 现在为 None
基本上就这些。理解 weakref 的核心是意识到“我不拥有这个对象”。只要不用强引用,配合 WeakValueDictionary 或 WeakMethod 使用,就能有效管理内存。不复杂但容易忽略。
以上就是怎么掌握python中weakref模块用法?的详细内容,更多请关注其它相关文章!
# 组播
# 河南新乡网站建设
# 平桥网站推广
# 毕节营销推广软件
# 云南seo助手打造企业
# 高平网站建设
# 湘西网站建设报价单
# 头条的产品营销推广策略
# 永清短视频推广营销中心
# 新乐大型网站建设资费
# 金华seo优化企业
# 我不
# 如果你
# python
# 源代码
# 如何将
# 数据包
# 绑定
# 转换为
# 键值
# 回调
# 键值对
# 区别
# ai
# 工具
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比
葱吃多了会怎样 葱吃多了会伤胃吗
微信语音通话掉线如何解决 微信语音通话稳定优化方法
红果短剧网页版官网入口 官方最新网址发布
DLsite中文平台入口 DLsite官网内容在线查看
深入理解Google Cloud Datastore查询:祖先路径与数据一致性
痛风发作了怎么办? 快速止痛和后期饮食调理
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台
从J*aScript对象中精确提取指定属性的教程
CSS子选择器:如何区分并样式化嵌套列表的子层级
12306选座怎么选到商务座_12306商务座选择与配置说明
Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法
在WordPress中通过REST API获取BasicAuth保护的远程文章
html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】
汽水音乐网页版使用入口_汽水音乐电脑版播放指南
文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】
哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法
j*a toString()的覆盖
AngularJS $http POST请求数据传递与Go后端接收实践
PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧
CKEditor 5 自定义构建在React应用中渲染失败的调试与解决
抓大鹅解压小游戏 抓大鹅摸鱼解压入口
Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧
J*aScript对象创建方式_J*aScript设计模式应用
如何更改在 Excel 中打开超链接时的默认浏览器
html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】
C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图
c++如何使用chrono库处理时间_c++标准库时间与日期操作
TikTok评论显示延迟如何处理 TikTok评论刷新优化方法
mc.js免安装版 mc.js一键畅玩入口
Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】
qq音乐在线播放入口_qq音乐电脑版登录链接
从OpenAI API响应中高效提取生成文本
UC浏览器网页版登录入口官网 电脑版网址入口
必由学在线入口 必由学网页版快速登录入口
NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰
抖音网页版快捷访问 抖音网页版网页版入口操作教程
在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南
利用5118提升短视频内容效果_5118短视频关键词优化方法
QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道
c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架
夸克AO3官网入口_AO3镜像网站2025推荐
德邦快递查询平台 德邦快递物流信息查询入口
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
单射、满射与双射的关系 一文理清所有逻辑
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
微信网页版扫码登录入口 微信网页版二维码登录入口
J*aScriptWebpack优化_J*aScript构建工具实战
蛙漫移动版在线看 蛙漫手机浏览器直达入口


2025-11-29
浏览次数:次
返回列表