2012-12-14 19 views
13

Was ist eine globale Aussage? Und wie wird es benutzt? Ich habe Python's official definition gelesen;
jedoch macht es mir nicht viel Sinn.In Python was ist eine globale Aussage?

+3

nur eine Bemerkung, 2.4 ist eine alte Version von Python, die eigentliche Referenz für [Python 2.X Version ist hier] (http://docs.python.org/2/reference/simple_stmts.html#global) –

+2

Python 3 kommt mit der neuen Anweisung 'nonlocal' zusammen mit' global', siehe auch. –

+0

@TahaJahangir - Das ist ein guter Punkt. Ich habe auch ein wenig Klappentext auf "nonlocal" in meiner Antwort wegen Ihres Kommentars hinzugefügt. Vielen Dank! – mgilson

Antwort

31

Jeden "Variable" in Python ist begrenzt bis zu einem gewissen Umfang. Der Umfang einer Python-Datei ist der Modulumfang. Beachten Sie Folgendes:

#file test.py 
myvariable = 5 # myvariable has module-level scope 

def func(): 
    x = 3  # x has "local" or function level scope. 

Objekte mit lokalem Geltungsbereich sterben, sobald die Funktion beendet und kann nie abgerufen werden (es sei denn, Sie return ihnen), aber innerhalb einer Funktion, können Sie Variablen in Modulebene Umfang zugreifen können (oder jede enthält scope):

myvariable = 5 
def func(): 
    print(myvariable) # prints 5 

def func2(): 
    x = 3 
    def func3(): 
     print(x)  # will print 3 because it picks it up from `func2`'s scope 

    func3() 

Sie können jedoch nicht Zuordnung auf dieser Referenz verwenden und erwarten, dass es zu einem äußeren Umfang propagiert wird:

myvariable = 5 
def func(): 
    myvariable = 6  # creates a new "local" variable. 
         # Doesn't affect the global version 
    print(myvariable) # prints 6 

func() 
print(myvariable)  # prints 5 

Jetzt sind wir endlich zu global. Das Schlüsselwort global ist die Art und Weise, wie Sie Python mitteilen, dass eine bestimmte Variable in Ihrer Funktion auf globaler Ebene (auf Modulebene) definiert ist.

myvariable = 5 
def func(): 
    global myvariable 
    myvariable = 6 # changes `myvariable` at the global scope 
    print(myvariable) # prints 6 

func() 
print(myvariable) # prints 6 now because we were able 
        # to modify the reference in the function 

Mit anderen Worten, können Sie den Wert von myvariable im Modul-Rahmen aus func ändern, wenn Sie das global Schlüsselwort verwenden.


Als beiseite, können Bereiche beliebig tief verschachtelt werden:

def func1(): 
    x = 3 
    def func2(): 
     print("x=",x,"func2") 
     y = 4 
     def func3(): 
      nonlocal x # try it with nonlocal commented out as well. See the difference. 
      print("x=",x,"func3") 
      print("y=",y,"func3") 
      z = 5 
      print("z=",z,"func3") 
      x = 10 

     func3() 

    func2() 
    print("x=",x,"func1") 

func1() 

Jetzt in diesem Fall keine der Variablen im globalen Bereich deklariert werden, und in python2, gibt es keine (leicht/clean) Möglichkeit, den Wert x im Bereich func1 von func3 zu ändern. Aus diesem Grund wurde das Schlüsselwort nonlocal in python3.x eingeführt. nonlocal ist eine Erweiterung von global, mit der Sie eine Variable ändern können, die Sie von einem anderen Bereich in welchem ​​Umfang auch immer abgerufen haben.

+0

+1 für eine gründliche Erklärung. Möglicherweise möchten Sie jedoch die Ergebnisse der Druckanweisungen anzeigen. –

+0

@StevenRumbalski - Fertig. Guter Vorschlag. – mgilson

+0

Ich habe das selbst getestet, nachdem ich deine Antwort gelesen habe, und mein Verständnis hat sich in diesem Bereich stark verbessert. Vielen Dank! – Capurnicus

0

Im Wesentlichen teilt es dem Interpreter mit, dass die angegebene Variable auf der globalen Ebene geändert und zugewiesen werden sollte, anstatt auf der lokalen Standardstufe.

0
a = 1 

def f(): 
    a = 2 # doesn't affect global a, this new definition hides it in local scope 

a = 1 

def f(): 
    global a 
    a = 2 # affects global a 
0

Sie können eine globale Variable in anderen Funktionen nutzen, indem sie als global in jeder Funktion zu erklären, dass es

Python modifiziert möchte sicherstellen, dass Sie das wirklich wissen, was Sie mit gerade spielen, indem Sie explizit verlangt das globale Schlüsselwort

Siehe this answer

1

mgilson hat einen guten Job gemacht, aber ich möchte noch etwas hinzufügen.

list1 = [1] 
list2 = [1] 

def main(): 
    list1.append(3) 
    #list1 = [9] 
    list2 = [222] 

    print list1, list2 


print "before main():", list1, list2 
>>> [1] [1] 
main() 
>>> [1,3] [222] 
print list1, list2  
>>> [1, 3] [1] 

Innerhalb einer Funktion nimmt Python jede Variable als lokale Variable , wenn Sie es als global deklarieren, oder Sie eine globale Variable zugreifen.

list1.append(2) 

war möglich, weil Sie auf die "list1" zugreifen und Listen veränderbar sind.

war möglich, weil Sie eine lokale Variable initialisieren.

Allerdings, wenn Sie uncomment # list1 = [9], werden Sie

UnboundLocalError: local variable 'list1' referenced before assignment 

bekommen Es bedeutet, dass Sie versuchen, eine neue lokale Variable ‚list1‘ zu initialisieren, aber es war schon vorher erwähnte, und Sie sind außerhalb des Umfangs, um es neu zuzuweisen.

Um den Gültigkeitsbereich einzugeben, deklarieren Sie 'list1' als global.

empfehle ich Ihnen this sogar zu lesen, obwohl es ein Tippfehler am Ende ist.

Verwandte Themen