关于《生成器运行时机导致的难以察觉的 bug》勘误

简介: 关于《生成器运行时机导致的难以察觉的 bug》勘误

摄影:产品经理烤牛油串竟然有点好吃

在文章《生成器运行时机导致的难以察觉的 bug》一文中,我最后解释为什么没有过滤掉无效数据的原因有问题。当时使用的是如下一段代码:



outer = 123
def i_am_generator():    print('生成器函数运行了。外部变量的值为:', outer)    yield
generator = i_am_generator()print(f'现在返回的是一个生成器对象:{generator}')
outer = 456for _ in generator:    ...

但这段代码中,生成器i_am_generator使用的始终是外部的变量。

但在实际举的例子中:


def do_filter(datas, to_filter):    for data in datas:        if to_filter in data:            continue        yield data

这个生成器是会接收传入参数的。它会使用参数传进来的值,而不是外部变量。在这种情况下,通过“值传递”进来的参数实际上是会有效的。我们修改一下原来的i_am_generator生成器:


outer = 123
def i_am_generator(data):    print('生成器函数运行了。外部变量的值为:', data)    yield
generator = i_am_generator(outer)print(f'现在返回的是一个生成器对象:{generator}')
outer = 456for _ in generator:    ...

运行效果如下图所示:

可以看到,在这种情况下,生成器里面打印出来的是outer变量修改之前的值,而不是修改后的值。outer变量一开始的值123通过值传递的方式传入生成器函数以后,就生效了。相当于复制了一份,所以原来的数据怎么修改都不会影响这个复制出来的数据。所以当我们后面修改outer的时候,并不会影响生成器中早已传入的值。

同理,对于我们举的过滤数据的例子,真正导致无法过滤无效数据的原因在这里:



def trash_filter():    datas = ['有效信息', '重要信息', '隐私信息', '脏数据', '保密信息', '无效数据', '大数据']    for word in ['无效', '脏']:        result = do_filter(datas, word)    return result

在这个循环里面,有两个生成器,但是他们都赋值到了result变量里面。所以第二个生成器就直接覆盖了第一个生成器。第一个生成器根本就没有执行。

所以最后执行的时候,实际上只有do_filter(datas, '脏')对应的生成器运行了。所以才会只过滤包含的内容。

目录
相关文章
阿里巴巴开发规约之代码格式
    1.如果括大号内没内容那么不换行,     2.小括号变量不能与括号有空格     3.如果/对/同时/开关/做保留等字与括号之间必须加空格     4.
1543 0
|
5月前
|
文字识别 算法 小程序
【项目总结】快瞳医疗化验单的OCR识别
快瞳科技通过图像识别技术,成功解决了医疗化验单OCR识别难题。项目要求精准识别表格内容,尤其是化验数值和名称,准确率达85%以上。针对化验单来源多样、干扰因素多的问题,团队采用智能文档抽取模型、opencv技术(如霍夫变换)进行图片扶正与裁剪,优化识别精度。最终,项目不仅达到药企要求,还实现超越,为医疗行业智能化转型提供了高性价比解决方案,助力快瞳科技在医疗信息化领域树立良好口碑。
|
机器学习/深度学习 分布式计算 算法
大数据算法有哪些
大数据算法有哪些
543 0
|
SQL 关系型数据库 MySQL
orchestrator搭建mysql高可用
orchestrator搭建mysql高可用
252 0
|
存储 缓存 安全
深入理解Linux虚拟内存管理(一)2
深入理解Linux虚拟内存管理(一)
219 2
|
算法 Java 应用服务中间件
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
|
存储 监控 数据库
Android经典实战之OkDownload的文件分段下载及合成原理
本文介绍了 OkDownload,一个高效的 Android 下载引擎,支持多线程下载、断点续传等功能。文章详细描述了文件分段下载及合成原理,包括任务创建、断点续传、并行下载等步骤,并展示了如何通过多种机制保证下载的稳定性和完整性。
468 0
|
安全 API 调度
「架构」嵌入式鸿蒙架构
**鸿蒙嵌入式架构概览** HarmonyOS,华为的分布式操作系统,应用于嵌入式设备,以微内核、跨平台能力和组件化设计著称。核心功能包括设备统一管理、分布式软总线及安全机制。特点:低时延、高安全性、易开发。优点在于灵活性、扩展性和性能,但需构建生态、增加开发者资源和争取市场认可。采用模块化设计,支持多语言开发,利用分布式通信协议和硬件抽象层,通过Huawei AppGallery推动应用生态。
717 0
|
网络协议
centos8 网卡 Nmcli(是network的简写 Nmcli)配置网络
centos8 网卡 Nmcli(是network的简写 Nmcli)配置网络
461 0