生成器列表转换在列表推导中或在列表推导之外完成时会产生不同的结果

时间:2018-04-04 14:48:42

标签: python numpy generator list-comprehension

我的代码片段表现得很奇怪;我做了另一个来说明问题。我认为这两个片段应该产生相同的结果,但不会:

alphas = np.arange(5)
args = zip(np.arange(5), np.arange(5))

output = [np.mean([ a+b for a, b in args]) for _ in alphas]

产生

[4.0, nan, nan, nan, nan]

alphas = np.arange(5)
args = zip(np.arange(5), np.arange(5))
args = list(args)  # <- this is the only difference

output = [np.mean([ a+b for a, b in args]) for _ in alphas]

产生

[4.0, 4.0, 4.0, 4.0, 4.0]

唯一的区别是生成器被转换为列表理解中的列表。 有没有人理解使结果不同的潜在机制?

1 个答案:

答案 0 :(得分:2)

生成器仅生成一次输出序列。您的第一个表达式使用out for的第一次迭代时的整个序列。当_从0前进到1并循环再次遍历args时,yield没有任何内容,并且您有一个空的回报。这会导致nan值为mean

在第二个示例中,args是一个静态列表;您可以根据需要多次迭代。