Python: Wie erfasse ich eine Variable, die in einem nicht globalen Ahnenumfang angegeben ist?

Gegeben:

def f(): x = 0 def g(): h() def h(): x += 1 print(x) g() >>> f() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 8, in f File "<stdin>", line 4, in g File "<stdin>", line 6, in h UnboundLocalError: local variable 'x' referenced before assignment >>> 

Wie kann ich die x Variable sehen?

Vielen Dank.

BEARBEITEN

Sollte es schon früher erwähnt haben, benutze ich Python 2.7.3

5 Solutions collect form web for “Python: Wie erfasse ich eine Variable, die in einem nicht globalen Ahnenumfang angegeben ist?”

Sie können x ein Funktionsattribut machen :

 def f(): fx = 0 def g(): h() def h(): fx += 1 print(fx) g() 

Auch von Python 3 können Sie nonlocal keyword verwenden.

Wenn Sie Python 3 verwenden, verwenden Sie das nonlocal Schlüsselwort. Setzen Sie nonlocal x am Anfang der Funktion h . Wenn Sie Python 2.x verwenden, macht eine Workaround x eine Liste mit einem Element, so dass Sie es ändern können:

 def f(): x = [0] def g(): h() def h(): x[0] += 1 print x[0] g() f() 

In Python 3 nur nonlocal :

 def f(): x = 0 def g(): h() def h(): nonlocal x x += 1 print(x) g() f() 

Können wir nicht x als Funktionsargumente als Workaround setzen

 def f(): x = 0 def g(): h(x) def h(x): x += 1 print(x) g() f() 

Am einfachsten ist es, eine dict oder leere Klasse zu verwenden, zB:

 class Empty: x = 0 def f(): closure1 = dict(x=0) closure2 = Empty() def g(): h(x) def h(x): closure1["x"] += 1 closure2.x += 1 g() print closure1["x"], closure2.x 

Obwohl viele gute Lösungen bereits vorhanden waren, haben sie Eckfälle:

  • Nonlocal, pro Ashwini, ist nur Python 3.x
  • Funktionsattribut, pro Ovgolovin, wird fehl, wird f neu definiert und später als Referenz aufgerufen
  • Python eval (kompilieren (...), Sandkasten), Globals gehen in Sandbox, wenn nicht in def, warum?
  • Python: Variablen sind noch zugänglich, wenn in try oder if definiert?
  • Warum können Funktionen in Python-Druckvariablen im Umschließungsbereich funktionieren, können sie aber nicht in der Zuordnung verwenden?
  • Was bedeutet Umfang
  • Variabler Bereich (Python Newbie)
  • Warum erbt keine Unterfunktion den Bereich in Python?
  • Python-Funktion Anrufe sind Blutungen Umfang, stateful, nicht zu initialisieren Parameter?
  • Python: Wie kann ich eval () im lokalen Gültigkeitsbereich einer Funktion ausführen?
  • Variable Bereiche in Python-Klassen
  • Wie kann man Variablen eines anderen Bereichs ändern?
  • Zweifel über python variablen Bereich
  • Python ist die beste Programmiersprache der Welt.