2016-06-04 3 views
0

Diese Frage ist ein Ergebnis eines Schülers von mir, der eine Frage über den folgenden Code stellt, und ich bin ehrlich gesagt völlig ratlos. Jede Hilfe wäre willkommen.Warum funktioniert der Bereich so?

Wenn ich diesen Code ausführen:

#test 2 

a = 1 

def func2(x): 
    x = x + a 
    return(x) 

print(func2(3)) 

funktioniert es völlig in Ordnung. Es ist in der Lage, den global-scoped Variable a zu nehmen und seinen Wert verwenden, um die Berechnung auszuführen und den Wert 4.

jedoch zurückkehren, wenn ich es so weit ändern:

# test 3 

a = 1 

def func3(x): 
    a = x + a 
    return(x) 

print(func3(3)) 

ich dann einen Fehler :

local variable 'a' referenced before assignment

Warum erhalte ich diesen Fehler nur, wenn ich den Wert von a in der Funktion auf einen neuen Wert aktualisiert werden soll, basierend auf dem ursprünglichen Wert? Was verstehe ich nicht? Ich denke, dass dieser zweite Code gut funktionieren sollte.

Vielen Dank im Voraus für jede Hilfe und Einsicht.

+0

persönlich (streng nicht erforderlich ist, was) Ich erkläre immer 'global' auf globale Variablen an der Spitze meiner Funktion, auch wenn ich sie nur lese. Es ist dokumentarisch und teilweise defensiv. Eine Möglichkeit, dies zu betrachten, ist, dass globale Variablen in Python nicht unterstützt werden, da sie die Kapselung unterbrechen. Also ja, sie sind ein bisschen peinlich. Versuche sie zu vermeiden. – cdarke

Antwort

2
a = 1 

def func3(x): 
    global a 
    a = x + a 
    return(x) 

print(func3(3)) 

Jetzt sollte es funktionieren.

Wenn Sie die Anweisung a=x+a in die Funktion einfügen, erstellt sie eine neue lokale Variable a und versucht, ihren Wert zu referenzieren (was eindeutig vorher nicht definiert wurde). Daher müssen Sie global a verwenden, bevor Sie den Wert einer globalen Variablen ändern, damit dieser weiß, auf welchen Wert Bezug genommen werden soll.

EDIT:

The execution of a function introduces a new symbol table used for the local variables of the function. More precisely, all variable assignments in a function store the value in the local symbol table; whereas variable references first look in the local symbol table, then in the local symbol tables of enclosing functions, then in the global symbol table, and finally in the table of built-in names. Thus, global variables cannot be directly assigned a value within a function (unless named in a global statement), although they may be referenced.

+0

Ah! Also sehr interessant. Vielen Dank für die Erklärung. Es macht jetzt vollkommen Sinn, aber ich muss zugeben, es ist eine sehr seltsame kleine Einschränkung! – User

+0

Wenn dies das Problem für Sie löst, können Sie die Antwort akzeptieren, damit das Poster eine Gutschrift erhält und SO die Frage als erledigt ansieht? Und ja, dieses Verhalten ist eines von Pythons "Gotchas". – gecko

+0

Ja. Ich wollte, aber es ließ mich nicht so schnell die Antwort wählen. – User

0
def func3(x): 
    a = x + a 
    return(x) 

Auf der rechten Seite der rechten Seite von A = x + a (also x + a), 'X' wird als Variable übergeben, wobei 'a' wird als Variable also nicht als Fehler übergeben. Ohne Verwendung Globals:

a = 1 

    def func3(x, a=2): 
     a = x + a 
     return(x) 

    func3(3) 

Returns: 5