2016-05-06 3 views
-1

IVariable Umfang python3

def func1(var): 
    if var == 0: 
     return 
    else 
     var = var - 1 
     func1(var) 

PROPOSAL = 1 

def func2(): 
    func1(PROPOSAL) 
    print(PROPOSAL) 

In den rekursiven Aufrufen haben in func1, wird die Variable PROPOSAL verringert werden, druckt 0 die print Aussage Sinn?

Edit: Ich hätte fragen sollen, warum tut es das nicht?

+0

Was ist also passiert, als Sie das versucht haben? –

Antwort

0

Nein, die PROPOSAL globale Variable wird nicht von Ihrem Code verringert werden. Das liegt nicht wirklich am Umfang, sondern daran, wie Python Argumente übergibt.

Wenn Sie eine Funktion aufrufen, die ein Argument verwendet, wird der Wert des übergebenen Arguments an einen Parameternamen gebunden, genau wie bei einer Zuweisung zu einer Variablen. Wenn der Wert veränderbar ist, wird eine direkte Änderung durch einen Namen über den anderen Namen sichtbar, aber wenn die Variable unveränderlich ist (wie in Python int), werden Sie nie eine Änderung an einem Variableneffekt sehen.

Hier ist ein Beispiel, das Funktion und regelmäßige Zuordnung arbeiten, um die gleiche Art und Weise zeigt:

x = 1 

y = x # binds the y to the same value as x 
y += 1 # modify y (which will rebind it, since integers are immutable) 
print(x, y) # prints "1 2" 

def func(z): # z is a local variable in func 
    z += 1 
    print(x, z) 
func(x) # also prints "1 2", for exactly the same reasons as the code above 

X = [1] 

Y = X # again, binds Y to the same list as X 
Y.append(2) # this time, we modify the list in place (without rebinding) 

print(X, Y) # prints "[1, 2] [1, 2]", since both names still refer to the same list 

def FUNC(Z): 
    Z.append(3): 
    print(X, Z) 
FUNC(X) # prints "[1, 2, 3] [1, 2, 3]" 

Natürlich eine Variable rebinding, die auf ein veränderbares Wert bezeichnet wird auch die Änderung bewirken, nicht in anderen Artikeln reflektiert werden der ursprüngliche Wert. Zum Beispiel haben Sie die append() Aufrufe im zweiten Teil des Codes mit Y = Y + [2] und Z = Z + [3] ersetzt, die ursprüngliche X Liste würde nicht geändert werden, da diese Zuweisungsanweisungen Y und Z statt der ursprünglichen Werte statt neu zu binden.

Die "erweiterte Zuweisung" -Operatoren wie +=, -= und *= sind ein bisschen schwierig. Sie versuchen zuerst, eine In-Place-Modifikation durchzuführen, wenn der Wert auf der linken Seite dies unterstützt (und viele veränderbare Typen dies tun). Wenn der Wert keine direkte Änderung dieser Art unterstützt (z. B. weil es ein unveränderliches Objekt ist oder weil der spezifische Operator nicht zulässig ist), greift er stattdessen auf den regulären Operator + zurück, um stattdessen einen neuen Wert zu erstellen (Wenn dies auch fehlschlägt, wird eine Ausnahme ausgelöst).

0

func1(PROPOSAL) wird KEINE zurückgeben und die globale Variable PROPOSAL wird nicht beeinflusst, da Sie diesen Rückgabewert nicht PROPOSAL zuweisen.

func2() nur nennt func1() und dann druckt die PROPOSAL Variable, die es nicht in func1(PROPOSAL) diesen Bereich gerade geändert wurde