2014-02-17 41 views
1

我的理解是python生成器表达式返回延迟评估的解析,并且在字典更改时更新字典中的对象。字典视图上的Python生成器似乎没有被懒惰地评估

考虑下面的代码(Python的2.7.6的Windows):

d = {} 
gt_three = (x for x in d.viewkeys() if x > 3) 
print list(gt_three) 
d[1] = 'one' 
d[4] = 'four' 
print list(gt_three) 

我所期望的输出如下:

[] 
[4] 

相反,我收到:

[] 
[] 

如果我在添加到字典后重新创建生成器,或者打印视图本身,我会看到预期的输出。 我对发电机了解不多?我对Python非常陌生。

回答

0

生成器表达式返回一个迭代器,它只能迭代一次。尝试在第一次迭代之后迭代器将始终将其视为空。

+0

我现在看到了区别谢谢,是实现我正在寻找一个生成器函数而不是表达式/理解的方式? – Dragos

+1

@Dragos:这取决于。我可能会使用'[x for x in d if x> 3]'并创建一个新列表,只要您需要一个反映新状态的地方,但这是一个猜测。你可以用一个'__iter__'方法来定义一个类,这个方法被实现为一个生成器函数,在这种情况下,每次迭代对象都会得到一个新的迭代器。 – user2357112