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
  • Warum erbt keine Unterfunktion den Bereich in Python?
  • Warum ist der Ort zum Zeitpunkt der Kompilierung bestimmt?
  • Globals und Einheimische in python exec ()
  • Wie kann man neue Scopes in Python schaffen?
  • Python überschreibt Variablen in verschachtelten Funktionen
  • Python eval (kompilieren (...), Sandkasten), Globals gehen in Sandbox, wenn nicht in def, warum?
  • Blockieren Sie den Bereich in Python
  • Scoping in Python 'für' Schleifen
  • Warum ist eine Klassenvariable nicht im Listenverständnis definiert, sondern eine andere ist?
  • Kurze Beschreibung der Scoping Regeln?
  • Den Block der Befehle, die in der mit Anweisung ausgeführt werden sollen
  • Python ist die beste Programmiersprache der Welt.