Erweiterte Geschachtelte List-Comprehension-Syntax

Ich war Herumspielen mit Liste Verstehens, um ein besseres Verständnis von Ihnen und ich lief in einige unerwartete Ausgabe, ich bin nicht in der Lage zu erklären. Ich habe nicht gefunden diese Frage gestellt, bevor, aber wenn es /ist/ein wiederholen Sie die Frage bitte ich zu entschuldigen.

War ich im wesentlichen beim schreiben einer generator, Generatoren erzeugt. Eine einfache generator, der verwendet-Liste Verständnis würde so Aussehen:

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

Was ich versucht habe zu tun war, schreiben einen generator, der erzeugt mit zwei Generatoren - von denen das erste erzeugt die geraden zahlen im Bereich(10) und das zweite generiert die ungeraden zahlen in der Reihe(10). Für diese habe ich:

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

Ich nicht verstehen, warum 'ich' verwiesen wird vor der Zuweisung

Dachte ich, es hätte etwas zu tun mit i in range(2), so habe ich getan:

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

Dieser hat nicht Sinn für mich, so dass ich dachte, es am besten zu versuchen, etwas einfacher ersten. Also ging ich zurück zu den Listen und ausprobiert:

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

welche ich voraussichtlich das gleiche wie:

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

Aber wenn ich versuchte es auf eine Ahnung, das funktionierte:

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

So, ich dachte, es könnte ein problem mit dem, was Niveau der Umfang der if - Anweisung arbeitet. Also versuchte ich Folgendes:

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

Und jetzt bin ich gründlich verwirrt. Kann mir bitte jemand erklären dieses Verhalten. Ich verstehe nicht, warum meine Liste Verstehens zu sein scheinen fehlerhaft ist, noch verstehe ich, wie die Bereiche der if - Anweisungen arbeiten.

PS: Beim Korrekturlesen die Frage, merkte ich, dass es sieht ein wenig wie eine Hausaufgaben-Frage - ist es nicht.

Schreibe einen Kommentar