Warum verschachtelte Funktionen auf Variablen von äußeren Funktionen zugreifen können, aber sie nicht ändern dürfen [duplizieren]

Diese Frage hat hier schon eine Antwort:

  • Python überschreibt Variablen in verschachtelten Funktionen 4 Antworten

Im zweiten Fall unten versucht Python, nach einer lokalen Variablen zu suchen. Wenn es nicht einen findet, warum kann es nicht in den äußeren Bereich schauen, wie es für den 1. Fall tut?

Dies sucht x im lokalen Bereich, dann äußere Umfang:

def f1(): x = 5 def f2(): print x 

Dies gibt die local variable 'x' referenced before assignment :

 def f1(): x = 5 def f2(): x+=1 

Ich darf die Signatur der Funktion f2 () nicht ändern, damit ich keine Werte von x überschreiten kann. Allerdings brauche ich eine Möglichkeit, x zu modifizieren. Gibt es eine Möglichkeit, Python explizit zu sagen, um einen Variablennamen im äußeren Bereich zu suchen (etwas ähnliches wie das global Schlüsselwort)?

Python Version: 2.7

2 Solutions collect form web for “Warum verschachtelte Funktionen auf Variablen von äußeren Funktionen zugreifen können, aber sie nicht ändern dürfen [duplizieren]”

 def f1(): x = { 'value': 5 } def f2(): x['value'] += 1 

Workaround ist, ein veränderliches Objekt zu verwenden und Mitglieder dieses Objekts zu aktualisieren. Namensbindung ist in Python schwierig, manchmal.

In Python 3.x ist dies möglich:

 def f1(): x = 5 def f2(): nonlocal x x+=1 return f2 

Das Problem und eine Lösung für sie, für Python 2.x auch, sind in diesem Beitrag gegeben. Darüber hinaus lesen Sie bitte PEP 3104 für weitere Informationen zu diesem Thema.

  • String mit 'f' Präfix in python-3.6
  • Python: Wie erfasse ich eine Variable, die in einem nicht globalen Ahnenumfang angegeben ist?
  • Kurze Beschreibung der Scoping Regeln?
  • Was bedeutet Umfang
  • Python: Wie kann ich eval () im lokalen Gültigkeitsbereich einer Funktion ausführen?
  • Python Variable Scope (Vorbehalt durch Verweis oder Kopie?)
  • Wie kann man Variablen eines anderen Bereichs ändern?
  • Python - Wie man eine globale Variable aus einer Funktion
  • Wie kann man neue Scopes in Python schaffen?
  • Warum erbt keine Unterfunktion den Bereich in Python?
  • Den Block der Befehle, die in der mit Anweisung ausgeführt werden sollen
  • Python ist die beste Programmiersprache der Welt.