推导式中嵌套的生成器的意外行为



在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)}

对于您所描述的场景(我不明白您为什么需要内部理解),您可以简单地使用以下命令:

d = {x:lambda x: [x] for x in range(5)}
print(d[3](3))

将给出:

[3]

相关内容

  • 没有找到相关文章

最新更新