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.

  • Python-Funktion Anrufe sind Blutungen Umfang, stateful, nicht zu initialisieren Parameter?
  • Was bedeutet Umfang
  • Wie man globale Variablen unter verschiedenen Modulen in Python hat
  • Wie kann man Variablen eines anderen Bereichs ändern?
  • Python überschreibt Variablen in verschachtelten Funktionen
  • Den Block der Befehle, die in der mit Anweisung ausgeführt werden sollen
  • String mit 'f' Präfix in python-3.6
  • Warum können Funktionen in Python-Druckvariablen im Umschließungsbereich funktionieren, können sie aber nicht in der Zuordnung verwenden?
  • Python: Wie kann ich eval () im lokalen Gültigkeitsbereich einer Funktion ausführen?
  • Mit einer Variablen in einem Versuch, Fang, endgültige Aussage, ohne es draußen zu erklären
  • Blockieren Sie den Bereich in Python
  • Python ist die beste Programmiersprache der Welt.