当使用嵌套在推导中的生成器时,在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] 删除。
我来说两句