【发布时间】:2015-10-13 08:46:13
【问题描述】:
考虑以下代码 sn-p:
class C(object):
a = 0
b = 1
seq = [1, 2, 4, 16, 17]
list_comp = [a if v%2 else b for v in seq]
gen_comp = (a if v%2 else b for v in seq)
上面的代码解释得很好。打印绑定到类变量的对象会导致:
print C.list_comp # [0, 1, 1, 1, 0]
print C.gen_comp # <generator object <genexpr> at ...>
可悲的是 - 尝试从 NameError 中的生成器结果中检索值:
next(C.gen_comp) # NameError: global name 'a' is not defined
预期的行为应该类似于列表理解 - 它应该产生 5 个值并在每次下一个 next() 调用时引发 StopIteration。
这里有什么不同?在每种情况下如何解析名称以及为什么会出现差异?
【问题讨论】:
-
不同之处在于列表推导现在在 Python 3 中有自己的范围,类似于生成器表达式。也在这里解释:docs.python.org/2/reference/executionmodel.html
标签: python python-2.7 generator python-2.x