2015-07-19 6 views
7

Ich bin ein Python Anfänger und ich bin von C/C++ Hintergrund. Ich benutze Python 2.7.Python: Variablen sind immer noch zugänglich, wenn sie in try oder if definiert sind?

Ich habe diesen Artikel gelesen: A Beginner’s Guide to Python’s Namespaces, Scope Resolution, and the LEGB Rule, und ich denke, ich habe ein wenig Verständnis für Python diese Technologien.

Heute wurde mir klar, dass ich so Python-Code schreiben:

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

Das heißt, var_x noch zugänglich ist es sogar ist nicht definieren vor wenn der. Da ich aus C/C++ - Hintergrund bin, ist dies etwas Neues für mich, da in C/C++ var_x in dem von if und sonst eingeschlossenen Bereich definiert sind, daher können Sie nicht mehr darauf zugreifen, wenn Sie var_x vor if definieren.

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

Meine Vermutung ist, dass in Python if keinen neuen Bereich erstellt. Alle Variablen, die in if neu definiert sind, befinden sich nur in dem Bereich, in dem sich if befindet und deshalb ist die Variable auch nach der if erreichbar. Wenn jedoch im obigen Beispiel var_x nur in if, aber nicht in else definiert ist, wird eine Warnung ausgegeben, dass der print var_x auf eine Variable verweist, die möglicherweise nicht definiert ist.

Ich habe ein gewisses Vertrauen in mein eigenes Verständnis. Aber, könnte jemand mir helfen, mich zu korrigieren, wenn ich irgendwo falsch liege, oder mir einen Link des Dokuments geben, das darüber diskutiert?

Danke.

+1

Sie haben Recht. Variablen, die in 'if' /' elif'/'else'-Blöcken definiert sind, sind in dem Bereich sichtbar, der den Block enthält. – MattDMo

+1

Dies gilt auch für 'for' und' while' Loops, sowie die 'with' Anweisung. Im Grunde alles außer Funktionen und Klassen (Sie können weiterhin auf Variablen über den Klassennamen zugreifen: 'Cls.var'). –

+1

können Sie sich umsehen, was ist und nicht im Bereich mit 'Locals()' und 'globals()' – NightShadeQueen

Antwort

10

Meine Vermutung ist, dass in Python if keinen neuen Bereich erstellt. Alle Variablen, die in if neu definiert wurden, befinden sich nur in dem Bereich, in dem sie sich befinden, und daher ist die Variable nach der if weiterhin zugänglich.

Das ist richtig. In Python, namespaces, die im Wesentlichen über die Variablenbereiche entscheiden, werden nur für Module und Funktionen (einschließlich Methoden; grundsätzlich alle def) erstellt. Also wird alles, was innerhalb einer Funktion (und nicht in einer Unterfunktion) passiert, im selben Namensraum platziert.

Es ist jedoch wichtig zu wissen, dass das bloße Vorhandensein einer Zuweisung innerhalb einer Funktion einen Namen im lokalen Namespace reserviert. Dies macht für einige interessante Situationen:

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

In dem obigen Code, mit dieser Zeile auf Kommentar, wird der Code gedruckt 5 wie Sie es erwarten kann. Das liegt daran, dass inner im äußeren Bereich nach dem Namen x suchen wird. Wenn Sie die Zeile x = 10 allerdings hinzufügen, wird der Name xlokale-inner sein, so dass die früher aufschauen x im lokalen Namensraum von inner aussehen wird.Aber da es noch nicht zugewiesen wurde, erhalten Sie eine UnboundLocalError ("lokale Variable 'X' referenziert vor Zuweisung"). Die nonlocal-Anweisung wurde in Python 3 hinzugefügt, um ein Problem zu beheben: Die Situation, in der Sie die x des äußeren Bereichs innerhalb der inneren Funktion tatsächlich ändern möchten.

Weitere Informationen zur Namenssuche finden Sie unter this related question.

+0

Danke, und es ist interessant, die Situation zu kennen, die du hier erwähnt hast. Ich habe nie davon gewusst! – yaobin

Verwandte Themen