Pythonumfang [doppelte]

Diese Frage hat hier schon eine Antwort:

  • UnboundLocalError in Python [doppelte] 8 Antworten

Ich versuche das herauszufinden:

c = 1 def f(n): print c + n def g(n): c = c + n f(1) => 2 g(1) => UnboundLocalError: local variable 'c' referenced before assignment 

Vielen Dank!

4 Solutions collect form web for “Pythonumfang [doppelte]”

Innerhalb einer Funktion werden Variablen, die zugeordnet sind, standardmäßig als lokale Variablen behandelt. Um globalen Variablen zuzuordnen, verwenden Sie die global Anweisung:

 def g(n): global c c = c + n 

Das ist einer der schrulligen Bereiche von Python, die sich bei mir nie gut gesessen hat.

Der globale Staat ist etwas zu vermeiden, vor allem, um es zu mutieren. Betrachten Sie, ob g() sollte einfach zwei Parameter nehmen oder wenn f() und g() müssen Methoden einer gemeinsamen Klasse mit c ein Instanzattribut sein

 class A: c = 1 def f(self, n): print self.c + n def g(self, n): self.c += n a = A() af(1) ag(1) af(1) 

Ausgänge:

 2 3 

Errata für Gregs Post :

Es sollte nein sein, bevor sie referenziert werden . Schau mal:

 X = 1
 Def explodieren ():
     Print x # hebt UnboundLocalError hier auf
     X = 2

Es explodiert, auch wenn x zugeordnet ist, nachdem es referenziert ist. In Python-Variable kann lokal oder verweisen äußere Bereich, und es kann nicht in einer Funktion ändern.

Anders als das, was Greg sagte, in Python 3.0, wird es die nonlocal Aussage zu sagen "hier sind einige Namen, die in den umschließenden Bereich definiert sind". Im Gegensatz zu Global müssen diese Namen schon außerhalb des aktuellen Umfangs definiert werden. Es wird leicht sein, Namen und Variablen aufzuspüren. Heutzutage kann man nicht sicher sein, wo "globals etwas" genau definiert ist.

  • Warum können Funktionen in Python-Druckvariablen im Umschließungsbereich funktionieren, können sie aber nicht in der Zuordnung verwenden?
  • Variabler Bereich (Python Newbie)
  • Globals und Einheimische in python exec ()
  • Python - Wie man eine globale Variable aus einer Funktion
  • Mit einer Variablen in einem Versuch, Fang, endgültige Aussage, ohne es draußen zu erklären
  • Generierung von Funktionen innerhalb der Schleife mit Lambda-Ausdruck in Python
  • Wie kann man Variablen eines anderen Bereichs ändern?
  • Wie kann man neue Scopes in Python schaffen?
  • Python eval (kompilieren (...), Sandkasten), Globals gehen in Sandbox, wenn nicht in def, warum?
  • Zweifel über python variablen Bereich
  • Wie kann ich auf eine Klassenvariable in einem Initialisierer in Python zugreifen?
  • Python ist die beste Programmiersprache der Welt.