【发布时间】:2014-05-06 19:44:05
【问题描述】:
这是测试代码:
units = [1, 2]
tens = [10, 20]
nums = (a + b for a in units for b in tens)
units = [3, 4]
tens = [30, 40]
[x for x in nums]
假设第 3 行 (nums = ...) 上的生成器表达式形成一个迭代器,我希望最终结果能够反映 units 和 tens 的最终分配值。 OTOH,如果要在第 3 行评估生成器表达式,生成结果元组,那么我希望使用 units 和 tens 的第一个定义。
我看到的是 MIX;即,结果是[31, 41, 32, 42]!?
谁能解释这种行为?
【问题讨论】:
-
答案是一样的;
units是生成器表达式 'function' 的参数,而tens被查找为全局。所以units绑定在第 3 行,tens没有。 -
请注意,这不是 Python 3 特定的。
-
@StevenRumbalski:不,它适用于从 2.4 开始的所有 Python 版本,其中引入了生成器表达式。
-
我刚刚发现(来自给我发这个谜题的“朋友”)它来自web.archive.org/web/20111003161227/http://web.mit.edu/rwbarton/…(并在ballingt.com/2014/03/23/… 中引用)。我还不清楚适用的范围规则,但我会继续对这里提供的解释进行猛烈抨击,直到我弄明白为止。 (我想我更喜欢 Scheme 中的范围规则!)
标签: python python-3.x nested generator generator-expression