2016-03-30 13 views
-1

Ich habe den folgenden Beispielcode:Globale Wörterbuch hat Wertänderung

A = None  
class App(object): 
    def __init__(self, a): 
     global A 
     A = a 
a = {'x': 1} 
print(A) # None 

App(a) 
print(A) # {'x': 1} 

a['x'] = 2 
print(A) # {'x': 2} # value change if dictionary 

a = 2 
print(A) # {'x': 2} # value not change 

Aber ich weiß nicht, warum global Ein hat Änderungswert? Helfen Sie mir bitte wissen

+1

So wie 'print (a)' das Objekt selbst druckt, anstatt die Zeichenkette 'a' zu drucken, weist' A' dem Objekt selbst 'A' zu, nicht der Name "a". 'A' ist dasselbe wie' a', nur weil sie sich auf dasselbe Objekt beziehen. Wenn Sie 'a ['x'] = 2 'verwenden, führen Sie eine Operation für das Objekt aus. Da sich 'A' auf dasselbe Objekt bezieht, sind die Änderungen sichtbar, wenn Sie' A' drucken. Wenn Sie "a = 2" sagen, bezieht sich "a" jetzt auf ein anderes Objekt. Es ändert nicht das Objekt, auf das es sich bezog, also sind die Änderungen in "A" nicht sichtbar. – zondo

+0

@zondo nett, ich denke, hier ist die Antwort, was ich brauche –

Antwort

0

Sie verwenden die Linie global A in Ihrer Klassenmethode. Dadurch wird sichergestellt, dass die Variable A die gleiche ist wie die globale A, die Sie in der ersten Zeile definieren. Wenn Sie diese Anweisung weglassen würden, wäre in der Funktion eine neue lokale Variable A definiert worden. Wenn Sie die Klassenmethode ausführen, verweist A jetzt a. Alle Änderungen an a gelten also auch für A.

In der letzten Zeile ändern Sie den Typ der Variablen a und es ist Wert. A verliert jetzt seine Bindung an a. Siehe diese Antwort für die Erklärung: "if you rebind the reference in the method, the outer scope will know nothing about it, and after you're done, the outer reference will still point at the original object."

+0

Ich verwende bewusst globale Variable. Ich verstehe einfach nicht, warum ich ein "a" Wörterbuch neu zuordnen muss, um das "A" zu ändern –

Verwandte Themen