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

目录
相关文章
|
6月前
|
设计模式 算法 程序员
程序员为何需要反复修改Bug?探寻代码编写中的挑战与现实
作为开发者,我们在日常开发过程中,往往会遇到反复修改bug的情况,而且不能一次性把代码写的完美无瑕,其实开发项目是一项复杂而富有挑战性的任务,即使经验丰富的程序员也难以在一次性编写完美无瑕地完成代码,我个人觉得一次性写好代码是不可能完成的事情。虽然在设计之初已经尽力思考全面,并在实际操作中力求精确,但程序员仍然需要花费大量时间和精力来调试和修复Bug。那么本文就来分享程序员需要反复修改Bug的原因,以及在开发中所面临的复杂性与挑战。
166 1
程序员为何需要反复修改Bug?探寻代码编写中的挑战与现实
|
6月前
在代码优化过程中,常见的错误和bug包括以下几点
在代码优化过程中,常见的错误和bug包括以下几点
|
9天前
|
缓存 JavaScript
pinia必看避坑指南:几行代码规避隐藏bug!非常重要!
【10月更文挑战第16天】pinia必看避坑指南:几行代码规避隐藏bug!非常重要!
25 4
pinia必看避坑指南:几行代码规避隐藏bug!非常重要!
|
3月前
|
缓存 JavaScript
pinia必看避坑指南:几行代码规避隐藏bug!
【8月更文挑战第17天】pinia必看避坑指南:几行代码规避隐藏bug!
47 2
|
4月前
|
敏捷开发 测试技术 持续交付
编码过程中有效地管理时间和精力,避免陷入无休止的调试循环
编码过程中有效地管理时间和精力,避免陷入无休止的调试循环
|
5月前
|
Java 数据库连接
惊呆了!JAVA反射:你的代码竟然能这样“自我修复”?
【6月更文挑战第30天】Java反射允许运行时访问类和方法,模拟“自我修复”能力。当UserService的getUserById方法抛出异常时,通过反射捕获异常并调用handleException进行处理。此示例展示了如何记录错误,返回默认用户对象,而无需原始代码更改。反射提供了一种动态异常处理机制,增强代码的适应性和弹性。
40 0
|
6月前
|
算法 安全 数据安全/隐私保护
深入探究一个长期隐藏的底层bug的学习报告
在软件开发的过程中,底层bug往往像一颗定时炸弹,随时可能引发严重的问题。本文将分享我在开发过程中遇到的一个长期未被发现的底层bug,以及我如何逐步排查并最终解决这个问题的全过程。通过这次排查,我深刻认识到了代码规范性的重要性。一个不规范的代码修改,虽然短期内可能不会引起问题,但长期累积下来,可能会引发灾难性的后果。此外,我也意识到了底层模块的通用性和风险意识的重要性。在解决一个问题的同时,应该审视是否有相似的问题存在,以避免未来的风险。
120 3
|
6月前
|
算法 程序员
为何程序员在编写程序时难以一次性将所有代码完美无瑕地完成,而是需要经历反复修改Bug的过程?
为何程序员在编写程序时难以一次性将所有代码完美无瑕地完成,而是需要经历反复修改Bug的过程?
65 7
生成器运行时机导致的难以察觉的 bug
生成器运行时机导致的难以察觉的 bug
71 0
|
编解码 Linux Python
来自实践中的教训,有时候纯ffmpeg命令并不好使,还得需要ffmpy包装器
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。 本文是ffmpeg使用的第二篇文章,主要是关于ffmpy的使用。 干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。
239 0