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

目录
相关文章
|
4月前
在代码优化过程中,常见的错误和bug包括以下几点
在代码优化过程中,常见的错误和bug包括以下几点
|
2月前
|
算法 程序员
为何程序员在编写程序时难以一次性将所有代码完美无瑕地完成,而是需要经历反复修改Bug的过程?
为何程序员在编写程序时难以一次性将所有代码完美无瑕地完成,而是需要经历反复修改Bug的过程?
18 7
|
12月前
生成器运行时机导致的难以察觉的 bug
生成器运行时机导致的难以察觉的 bug
44 0
|
编解码 Linux Python
来自实践中的教训,有时候纯ffmpeg命令并不好使,还得需要ffmpy包装器
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。 本文是ffmpeg使用的第二篇文章,主要是关于ffmpy的使用。 干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。
200 0
|
缓存 测试技术 数据库
【测试基础理论】卡死我了!这算bug么?(非功能-效率性)
【测试基础理论】卡死我了!这算bug么?(非功能-效率性)
|
存储 缓存 安全
RxJava 容易忽视的细节: subscribeOn() 方法没有按照预期地运行
RxJava 容易忽视的细节: subscribeOn() 方法没有按照预期地运行
496 0
|
开发者 前端开发
[译] 如何避免我作为初级开发者时所犯下的 7 个错误
我们应该从中吸取教训。在成为高级开发者的过程中,我犯过许多错误。本文讲述了当我还是初级开发者时犯过的 7 个严重错误,以及如何避免这些错误。
851 0
|
NoSQL 测试技术 程序员
关于代码的那些低级错误,都是血泪的教训
无论你是初级工程师,中级工程师,高级工程师,甚至是全栈工程师、架构师,都是从零开使一步一步走出来的,想必都会犯过一些低级错误。 那些错误都是怎么发生的,如何避免发生错误呢,看看我们各位资深的程序员以自身为例,告诫我们敬畏每一段代码
5397 0
|
监控 测试技术
消灭bug秘籍 如何处理大型软件中的错误和异常
"我在测试中没有发现任何bug,这就意味着没有bug……对吗?"千万不要这样认为。由于大型软件的复杂程度很高,不管你做了多少测试,都不可能达到零bug的程度。因为你并不能揣测出用户的所有使用方式,因此,了解应用程序中错误和异常之间的差异,是非常重要的。
1228 0