Warum erbt keine Unterfunktion den Bereich in Python?

Ich verstehe nicht, warum das folgende nicht funktioniert:

def foo( x ): n = 1 summe = 0 def bar(): n -= 1 for i in range(0,10): y = x+i+n x += i summe += y print "{0} = {1} + {2} + {3}".format(y,x,i,n) bar() print "summe =", summe return summe 

Warum ist es, dass bar() nicht den Umfang von foo() erbt? Ist das ein C'ism, den ich vergessen muss? Gibt es einen Weg, den ich machen kann?

2 Solutions collect form web for “Warum erbt keine Unterfunktion den Bereich in Python?”

PEP 3104 liefert eine Erklärung und eine Lösung für dieses Problem. Das Problem ist, dass Python jede Zuordnung zu einem Namen als lokale Variablendeklaration behandelt.

 >>> n = 1 >>> def bar(): >>> n = n + 1 >>> >>> bar() Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> bar() File "<pyshell#7>", line 2, in bar n = n + 1 UnboundLocalError: local variable 'n' referenced before assignment 

Es gibt ein paar Workarounds für dieses Problem, wenn Sie eine Python-Version ohne das nonlocal- Schlüsselwort verwenden. Ein hässlicher Trick ist, Ihre Variable in einer Liste zu verpacken:

 >>> n=[1] >>> def bar(): >>> n[0] = n[0] + 1 >>> >>> bar() >>> n [2] 

Obwohl dieser Trick funktioniert, ist es in der Regel besser, den Code umzuschreiben, um die Notwendigkeit für nicht-lokale Zuordnungen zu entfernen.

Ich habe diese Frage bei der Suche nach einer Lösung für ein etwas anderes Problem gefunden. Lokale Variablen werden nicht von sub vererbt, aber es gibt nichts, das dich davon abhält, die Variable an die innere Funktion zu übergeben und dann die Ergebnisse bei der Rückgabe zuzuordnen.

Dies ist neben der nonlocal Aussage in PEP 3104 . Es ist etwas weniger hässlich und macht das Auswendiglernen ein weiteres Pythonschlüsselwort weniger entscheidend.

 def foo( x ): n = 1 summe = 0 def bar(n): n -= 1 return n for i in range(0,10): n = bar(n) y = x+i+n x += i summe += y print "{0} = {1} + {2} + {3}".format(y,x,i,n) print "summe =", summe return summe 
  • Scoping in Python 'für' Schleifen
  • Python: Wie kann ich eval () im lokalen Gültigkeitsbereich einer Funktion ausführen?
  • Python - Wie man eine globale Variable aus einer Funktion
  • Blockieren Sie den Bereich in Python
  • Funktion Ortsname Bindung aus einem äußeren Bereich
  • Wie man globale Variablen unter verschiedenen Modulen in Python hat
  • Generierung von Funktionen innerhalb der Schleife mit Lambda-Ausdruck in Python
  • Wie kann man Variablen eines anderen Bereichs ändern?
  • Python überschreibt Variablen in verschachtelten Funktionen
  • Python: Variablen sind noch zugänglich, wenn in try oder if definiert?
  • Pythonumfang [doppelte]
  • Python ist die beste Programmiersprache der Welt.