Python überschreibt Variablen in verschachtelten Funktionen

Angenommen, ich habe den folgenden Python-Code:

def outer(): string = "" def inner(): string = "String was changed by a nested function!" inner() return string 

Ich möchte einen Anruf zu äußere (), um zurückzukehren "String wurde durch eine verschachtelte Funktion geändert!", Aber ich bekomme "". Ich schließe, dass Python denkt, dass die Zeile string = "string was changed by a nested function!" Ist eine Deklaration einer neuen Variablen local to inner (). Meine Frage ist: Wie sage ich Python, dass es die äußere () Zeichenfolge verwenden sollte? Ich kann das global Schlüsselwort nicht verwenden, weil der String nicht global ist, sondern nur in einem äußeren Bereich lebt. Ideen?

4 Solutions collect form web for “Python überschreibt Variablen in verschachtelten Funktionen”

In Python 3.x kannst du das nonlocal Schlüsselwort verwenden:

 def outer(): string = "" def inner(): nonlocal string string = "String was changed by a nested function!" inner() return string 

In Python 2.x können Sie eine Liste mit einem einzelnen Element verwenden und das einzelne Element überschreiben:

 def outer(): string = [""] def inner(): string[0] = "String was changed by a nested function!" inner() return string[0] 

Sie können dies auch mit Funktionsattributen umgehen:

 def outer(): def inner(): inner.string = "String was changed by a nested function!" inner.string = "" inner() return inner.string 

Klarstellung: Das funktioniert sowohl in python 2.x als auch in 3.x.

Das passiert mir viel zu oft, als ich eine Funktion schrieb und ich merke plötzlich, dass es eine gute Idee sein könnte, eine kleinere Helferfunktion zu haben, aber nicht wirklich nirgendwo anders. Was mich natürlich dazu bringt, es als verschachtelte Funktion zu definieren.

Aber ich hatte Erfahrung mit dem anonymen JAVA-Objekt (dh: definiere ein Runnable), und die Regel war, dass das anonyme Objekt eine Kopie seiner äußeren Umgebung macht, in diesem Fall Variablen des äußeren Bereichs. Wenn also die äußere Variable eine unveränderliche ( int , char ) ist, können sie nicht durch anonyme Objekte modifiziert werden, da sie per Wert kopiert werden , wohingegen sie, wenn sie eine veränderliche ( collection , objects ) sind, geändert werden können … da sie kopiert werden Durch " Zeiger " (ihre Adresse im Speicher)

Wenn Sie über die Programmierung wissen, denken Sie an es als Pass durch Wert und übergeben Sie durch Verweis.

In python, es ist sehr ähnlich x=123 ist eine Zuordnung, sie geben die Variable xa neue Bedeutung (nicht die alten x ändern), list[i]/dict[key] sind Objektzugriffsoperationen, sie ändern wirklich Dinge

Zu schließen, du brauchst ein veränderliches Objekt … um zu ändern (auch wenn du auf ein Tupel mit [] zugreifen kannst, kannst du es hier nicht benutzen, da es nicht veränderbar ist)

Um Svens Antwort hinzuzufügen:

In Python 2.x können Sie nur äußere Bereichsvariablen aus dem inneren Bereich lesen . Zuweisen wird nur eine neue lokale (dh innere Bereich) Variable, die den äußeren Bereich eins verbirgt.

Wenn du lesen und modifizieren möchtest, kannst du einen dict , um deine Variablen im äußeren Bereich zu halten und dann über den Dict im inneren Bereich zuzugreifen und deinen Code auch in der Gegenwart von mehreren Außenbereichsvarnen ziemlich sauber und lesbar zu halten :

 def outer(): # hold some text, plus the number of spaces in the text vars = {'text': 'Some text.', 'num_spaces': 1} def inner(): # add some more text more_text = ' Then some more text.' vars['text'] += more_text # keep track of the number of spaces vars['num_spaces'] += more_text.count(' ') inner() return vars['text'], vars['num_spaces'] 

Ausgabe:

 >>> outer() ('Some text. Then some more text.', 5) 
  • Python-Funktion Anrufe sind Blutungen Umfang, stateful, nicht zu initialisieren Parameter?
  • Wie man globale Variablen unter verschiedenen Modulen in Python hat
  • Python: Variablen sind noch zugänglich, wenn in try oder if definiert?
  • Lambda-Funktion acessing außerhalb variabel [duplicate]
  • Warum ist der Ort zum Zeitpunkt der Kompilierung bestimmt?
  • Pythonumfang [doppelte]
  • Warum können Funktionen in Python-Druckvariablen im Umschließungsbereich funktionieren, können sie aber nicht in der Zuordnung verwenden?
  • Globals und Einheimische in python exec ()
  • Zweifel über python variablen Bereich
  • Variabler Bereich (Python Newbie)
  • Warum verschachtelte Funktionen auf Variablen von äußeren Funktionen zugreifen können, aber sie nicht ändern dürfen [duplizieren]
  • Python ist die beste Programmiersprache der Welt.