Python: Variablen sind noch zugänglich, wenn in try oder if definiert?

Ich bin ein Python-Anfänger und ich bin aus C / C ++ – Hintergrund. Ich benutze Python 2.7.

Ich lese diesen Artikel: Ein Anfänger Guide zu Python's Namespaces, Scope Resolution und die LEGB Rule , und ich denke, ich habe ein Verständnis von Python diese Technologien.

Heute habe ich erkannt, dass ich so einen Python-Code schreiben kann:

if condition_1: var_x = some_value else: var_x = another_value print var_x 

Das heißt, var_x ist noch zugänglich, auch wenn es nicht vor dem if ist. Weil ich aus dem C / C ++ – Hintergrund bin, ist das für mich neu, wie in C / C ++, var_x in dem von var_x eingeschlossenen Umfang definiert und dann kannst du nicht mehr darauf zugreifen, es sei denn du definierst var_x vor if .

Ich habe versucht, die Antworten auf Google zu suchen, aber weil ich immer noch neu in Python bin, weiß ich nicht einmal, wo ich anfangen soll und welche Schlüsselwörter ich verwenden sollte.

Meine Vermutung ist, dass, in Python, if nicht schaffen neue Umfang. Alle Variablen, die neu definiert sind, if nur in den Geltungsbereich, dass, if wohnt und dies ist, warum die Variable ist immer noch zugänglich nach dem if . Wenn jedoch var_x im obigen Beispiel nur dann definiert ist, if nicht else , so wird eine Warnung ausgegeben, um zu sagen, dass der print var_x auf eine Variable print var_x darf, die nicht definiert werden kann.

Ich habe Vertrauen in mein eigenes Verständnis. Allerdings könnte jemand mir helfen, mich zu korrigieren, wenn ich irgendwo falsch bin, oder gib mir einen Link des Dokuments, das darüber spricht?

Vielen Dank.

One Solution collect form web for “Python: Variablen sind noch zugänglich, wenn in try oder if definiert?”

Meine Vermutung ist, dass, in Python, if nicht schaffen neue Umfang. Alle Variablen, die neu definiert sind, if nur in den Geltungsbereich, dass, wenn in wohnt und dies ist, warum die Variable ist immer noch zugänglich nach dem if .

Das ist richtig. In Python werden Namespaces , die sich im Wesentlichen über die variablen Bereiche entscheiden, nur für Module und Funktionen (einschließlich Methoden, im Grunde jeden def ) erstellt. Also alles, was in einer Funktion geschieht (und nicht in einer Unterfunktion), wird in denselben Namensraum platziert.

Es ist wichtig zu wissen, dass die bloße Existenz einer Aufgabe innerhalb einer Funktion einen Namen im lokalen Namespace reservieren wird. Das macht für einige interessante Situationen:

 def outer (): x = 5 def inner (): print(x) # x = 10 inner() outer() 

Im obigen Code, mit dieser Zeile kommentiert, wird der Code 5 drucken, wie Sie erwarten können. Das ist, weil inner Blick in den äußeren Bereich für den Namen x . Wenn du die Zeile x = 10 hinzufügst, wird der Name x lokal zu inner , also der frühere Blick nach x wird in den lokalen Namespace von inner suchen. Da es noch nicht zugewiesen wurde, UnboundLocalError du einen UnboundLocalError ( "lokale Variable" x 'referenziert vor Zuordnung " ). Die nonlocal Anweisung wurde in Python 3 hinzugefügt, um ein Problem daraus zu überwinden: Die Situation, in der du das x des äußeren Bereichs innerhalb der inneren Funktion tatsächlich ändern möchtest.

Weitere Informationen zum Namens-Lookup finden Sie in dieser Frage .

  • Warum ist der Ort zum Zeitpunkt der Kompilierung bestimmt?
  • Python: Wie erfasse ich eine Variable, die in einem nicht globalen Ahnenumfang angegeben ist?
  • Python - Wie man eine globale Variable aus einer Funktion
  • "Lokale Variable referenziert vor Zuordnung" - nur Funktionen?
  • __main__ und scoping in python
  • Python-Funktion Anrufe sind Blutungen Umfang, stateful, nicht zu initialisieren Parameter?
  • Globals und Einheimische in python exec ()
  • Python Variable Scope (Vorbehalt durch Verweis oder Kopie?)
  • String mit 'f' Präfix in python-3.6
  • Blockieren Sie den Bereich in Python
  • 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.