2016-09-10 6 views
0

ich Python lernen und lief dieses Stück Code in der Python-Konsole früher heute:Sind lokale Variablen in Generatorfunktionen nicht verfügbar?

num = 0 

def generator(): 
    while True: 
     yield num 
     num += 1 

for i in generator(): 
    if i > 5: break 
    print(i) 

Es hat einen

UnboundLocalError: local variable 'num' referenced before assignment warf ich wieder schrieb den Code und diese Version gearbeitet:

def generator(): 
    num = 0 
    while True: 
     yield num 
     num += 1 

for i in generator(): 
    if i > 5: break 
    print(i) 

Meine Frage ist das: Können Sie nicht lokale Variablen in Generatorfunktionen verwenden, wie Sie mit regulären Funktionen können?

+2

'num' ist nicht lokal zu Ihrer Funktion im Fehlercode – UnholySheep

+0

@UnholySheep wenn ich eine Funktion definiere,' test() 'mit' print (num) 'darin und rufe' test() 'in der Konsole auf, es druckt 0. – Vinayak

+2

@Vinayak aus der akzeptierten Antwort der verknüpften Frage: "Wenn Sie einfach auf eine globale Variable zugreifen möchten, verwenden Sie einfach seinen Namen. Um jedoch seinen Wert zu ändern, müssen Sie das globale Schlüsselwort verwenden." – Mephy

Antwort

1

Im ersten Code versuchen Sie, num als globale Variable zu verwenden: Es ist außerhalb der Funktion definiert.

Wenn das Programm num += 1 erreicht, versuchen Sie dann, eine lokale Variable zuzuweisen, die denselben Namen wie die globale hat, die Sie zuvor referenziert haben. Da einer lokalen Variablen mit dem Namen num noch kein Wert zugewiesen wurde, schlägt das Inkrement fehl.

Wenn Sie eine globale Variable innerhalb einer Funktion zuweisen oder inkrementieren wollen, muss sie mit global num deklariert werden (normalerweise gleich zu Beginn der Funktion). Das hat nichts mit Generatoren zu tun, es würde auch für normale Funktionen versagen.

1

Wie UnholySheep has commented ist die num Variable nicht lokal innerhalb der generator() Funktion definiert.

Gerade Marke, die Sie aus dem globalen Namensraum in der generator() Funktion zu verwenden, mit dem global Stichwort:

num = 0 

def generator(): 
    global num 
    while True: 
     yield num 
     num += 1 

for i in generator(): 
    if i > 5: break 
    print(i) 

... und alles sollte in Ordnung sein.

Hinweis: Das Problem hängt nicht mit der Art der Funktion (Generator einschließlich yield) zusammen, die Sie verwenden.

Verwandte Themen