Sintaxe avançada de compreensão de lista aninhada

Eu estava brincando com as compreensões da lista para entender melhor elas e encontrei uma saída inesperada que não sou capaz de explicar. Não encontrei essa pergunta antes, mas se for uma pergunta repetida, peço desculpas.

Eu estava basicamente tentando escrever um gerador que gerasse geradores. Um gerador simples que usa compreensão de lista ficaria assim:

(x for x in range(10) if x%2==0) # generates all even integers in range(10)

O que eu estava tentando fazer era escrever um gerador que gerasse dois geradores - o primeiro gerando os números pares no intervalo (10) e o segundo gerando os números ímpares no intervalo (10). Para isso, eu fiz:

>>> (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

Não entendo por que 'i' está sendo referenciado antes da atribuição

Eu pensei que poderia ter algo a ver comi in range(2), então eu fiz:

>>> 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

Isso não fazia sentido para mim, então achei melhor tentar algo mais simples primeiro. Então, voltei às listas e tentei:

>>> [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]

que eu esperava ser o mesmo que:

>>> 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?

Mas quando eu tentei com um palpite, isso funcionou:

>>> [[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

Então eu pensei que poderia ser um problema com qual nível de escopo oif A instrução opera. Então, tentei o seguinte:

>>> [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]

E agora estou completamente confuso. Alguém por favor pode explicar esse comportamento. Não entendo por que minhas compreensões de lista parecem malformadas, nem como o escopo doif declarações funcionam.

PS: Ao revisar a pergunta, percebi que isso se parece um pouco com uma pergunta de lição de casa - não é.

questionAnswers(4)

yourAnswerToTheQuestion