【发布时间】:2011-04-15 13:37:14
【问题描述】:
我正在玩弄列表推导以更好地理解它们,但我遇到了一些我无法解释的意外输出。我之前没有发现这个问题被问过,但如果它/是/重复的问题,我很抱歉。
我本质上是在尝试编写一个生成器的生成器。一个使用列表推导的简单生成器如下所示:
(x for x in range(10) if x%2==0) # generates all even integers in range(10)
我试图做的是编写一个生成器,它生成两个生成器——第一个生成范围 (10) 中的偶数,第二个生成范围 (10) 中的奇数。为此,我做了:
>>> (x for x in range(10) if x%2==i for i in range(2))
<generator object <genexpr> at 0x7f6b90948f00>
>>> for i in g.next(): print i
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
UnboundLocalError: local variable 'i' referenced before assignment
>>> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> g = (x for x in range(10) if x%2==i for i in range(2))
>>> g
<generator object <genexpr> at 0x7f6b90969730>
>>> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
UnboundLocalError: local variable 'i' referenced before assignment
我不明白为什么在分配之前引用了“i”
我认为这可能与i in range(2)有关,所以我做了:
>>> g = (x for x in range(10) if x%2==i for i in [0.1])
>>> g
<generator object <genexpr> at 0x7f6b90948f00>
>>> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
UnboundLocalError: local variable 'i' referenced before assignment
这对我来说没有意义,所以我认为最好先尝试一些更简单的东西。所以我回到列表并尝试:
>>> [x for x in range(10) if x%2==i for i in range(2)]
[1, 1, 3, 3, 5, 5, 7, 7, 9, 9]
我希望与以下内容相同:
>>> l = []
>>> for i in range(2):
... for x in range(10):
... if x%2==i:
... l.append(x)
...
>>> l
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9] # so where is my list comprehension malformed?
但是当我凭直觉尝试时,它奏效了:
>>> [[x for x in range(10) if x%2==i] for i in range(2)]
[[0, 2, 4, 6, 8], [1, 3, 5, 7, 9]] # so nested lists in nested list comprehension somehow affect the scope of if statements? :S
所以我认为这可能是if 语句在什么范围内运行的问题。所以我尝试了这个:
>>> [x for x in range(10) for i in range(2) if x%2==i]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
现在我完全糊涂了。有人可以解释这种行为。我不明白为什么我的列表推导似乎格式不正确,也不明白if 语句的作用域是如何工作的。
PS:在校对问题时,我意识到这看起来确实有点像家庭作业问题 - 它不是。
【问题讨论】:
-
[x for x in range(10) if x%2==i for i in range(2)]工作了吗?我收到NameError: name 'i' is not defined(Python 2.6.2) -
@ManojGovindan:我得到的正是你得到的(Python 2.6.5)
标签: python syntax scope list-comprehension