生成器中嵌套的异常行为

扎卡

当使用嵌套在推导中的生成器时,在Python中出现意外行为,在下面的这种特定情况下为字典推导。更具体地说,请考虑以下简单理解:

D = {x : (y for y in range(5) if y==x) for x in range(5)}

我本来希望获得一个字典,D这样list(D[x]) == [x]对于从0到4的每个整数i。结果是

>>> list(D[0])
[4]
>>> list(D[1])
[4]
>>> list(D[2])
[4]
>>> list(D[3])
[4]
>>> list(D[4])
[4]

我认为发生这种情况是因为x用于定义生成器的变量的值一直在更改,直到固定为4。但是,我认为每个生成器都应在定义时使用变量的确切值进行定义。对于这种简单的嵌套结构,是否有一种替代方法可以更正并具有预期的结果?

请注意,将生成器实现为列表将解决此问题:

D = {x : list((y for y in range(5) if y==x)) for x in range(5)}

但我对保留生成器使用的解决方案感兴趣。

切普纳

x是一个自由变量,因此在实际迭代生成器之前,不会考虑它的值。正如您所注意到的,这意味着的值x可以在定义生成器和实际使用生成器之间改变。

无法将值传递到生成器表达式中。您必须使用生成器函数:

def make_generator(x):
    for y in range(5):
        if y == x:
            yield y

D = {x: make_generator(x) for x in range(5)}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

生成器中嵌套的异常行为

来自分类Dev

生成器中嵌套的异常行为

来自分类Dev

生成器中嵌套的异常行为

来自分类Dev

生成器的异常处理

来自分类Dev

生成器的异常处理

来自分类Dev

如何嵌套生成器

来自分类Dev

Python:send()在生成器中的行为

来自分类Dev

为什么未在Python生成器中捕获异常?

来自分类Dev

Pytest 不会向夹具生成器中抛出异常

来自分类Dev

Nosetest生成器方法行为

来自分类Dev

媒体插件生成器行为的问题

来自分类Dev

生成器的Python循环行为

来自分类Dev

随机生成器意外行为

来自分类Dev

媒体插件生成器行为的问题

来自分类Dev

随机生成器意外行为

来自分类Dev

强制迭代生成器以查看异常

来自分类Dev

强制迭代生成器以查看异常

来自分类Dev

使用生成器而不是嵌套循环

来自分类Dev

转置嵌套生成器

来自分类Dev

嵌套生成器未正确触发

来自分类Dev

带生成器的嵌套列表理解

来自分类Dev

python中嵌套列表理解和嵌套生成器表达式的顺序

来自分类Dev

使用izip的Python递归生成器中的意外行为

来自分类Dev

(为什么)我不能从生成器中抛出异常吗?

来自分类Dev

使用生成器搜索双重嵌套字典列表中的元素

来自分类Dev

有可能在Lucid的AdonisJs中执行嵌套查询生成器吗?

来自分类Dev

JavaScript奇怪的生成器yield子函数行为

来自分类Dev

了解JavaScript中的生成器

来自分类Dev

Python中的生成器和for循环