关于《生成器运行时机导致的难以察觉的 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, '脏')对应的生成器运行了。所以才会只过滤包含的内容。

目录
相关文章
|
3月前
|
缓存 JavaScript
pinia必看避坑指南:几行代码规避隐藏bug!
【8月更文挑战第17天】pinia必看避坑指南:几行代码规避隐藏bug!
49 2
|
4月前
|
敏捷开发 测试技术 持续交付
编码过程中有效地管理时间和精力,避免陷入无休止的调试循环
编码过程中有效地管理时间和精力,避免陷入无休止的调试循环
|
5月前
|
Java 数据库连接
惊呆了!JAVA反射:你的代码竟然能这样“自我修复”?
【6月更文挑战第30天】Java反射允许运行时访问类和方法,模拟“自我修复”能力。当UserService的getUserById方法抛出异常时,通过反射捕获异常并调用handleException进行处理。此示例展示了如何记录错误,返回默认用户对象,而无需原始代码更改。反射提供了一种动态异常处理机制,增强代码的适应性和弹性。
43 0
|
5月前
|
算法 前端开发 Java
Bug复盘:接口异步返回的重要性
Bug复盘:接口异步返回的重要性
|
6月前
|
算法 安全 数据安全/隐私保护
深入探究一个长期隐藏的底层bug的学习报告
在软件开发的过程中,底层bug往往像一颗定时炸弹,随时可能引发严重的问题。本文将分享我在开发过程中遇到的一个长期未被发现的底层bug,以及我如何逐步排查并最终解决这个问题的全过程。通过这次排查,我深刻认识到了代码规范性的重要性。一个不规范的代码修改,虽然短期内可能不会引起问题,但长期累积下来,可能会引发灾难性的后果。此外,我也意识到了底层模块的通用性和风险意识的重要性。在解决一个问题的同时,应该审视是否有相似的问题存在,以避免未来的风险。
126 3
|
6月前
|
算法 程序员
为何程序员在编写程序时难以一次性将所有代码完美无瑕地完成,而是需要经历反复修改Bug的过程?
为何程序员在编写程序时难以一次性将所有代码完美无瑕地完成,而是需要经历反复修改Bug的过程?
65 7
|
6月前
|
JSON 缓存 前端开发
编写代码前,如何规避尽可能多的前端bug?
编写代码前,如何规避尽可能多的前端bug?
70 0
|
测试技术
代码为啥不能过度优化
代码为啥不能过度优化
74 0
|
关系型数据库 MySQL API
被无视的小细节
被无视的小细节
73 0
生成器运行时机导致的难以察觉的 bug
生成器运行时机导致的难以察觉的 bug
72 0