you need to use some parentheses:
((x for x in range(10) if x%2==i) for i in range(2))
This didn’t make sense to me, so I
thought it best to try something
simpler first. So I went back to lists
and tried:[>>> [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]
That worked because a previous list comprehension leaks the i variable to the enclosing scope, and become the i for the current one. Try starting a fresh python interpreter, and that would fail due to NameError. The counter’s leaking behavior has been removed in Python 3.
EDIT:
The equivalent for loop for:
(x for x in range(10) if x%2==i for i in range(2))
would be:
l = []
for x in range(10):
if x%2 == i:
for i in range(2):
l.append(x)
which also gives a name error.
EDIT2:
the parenthesed version:
((x for x in range(10) if x%2==i) for i in range(2))
is equivalent to:
li = []
for i in range(2):
lx = []
for x in range(10):
if x%2==i:
lx.append(x)
li.append(lx)