2012-12-14 13 views
13

Co to jest globalne oświadczenie ? I w jaki sposób jest używany? Przeczytałem Python's official definition;
Jednak nie ma to dla mnie większego sensu.Co to jest wypowiedź globalna w języku Python?

+3

tylko uwaga, 2.4 to stara wersja Pythona, aktualne odniesienie dla [wersja Pythona 2.X jest tutaj] (http://docs.python.org/2/reference/simple_stmts.html#global) –

+2

Python 3 zawiera nową instrukcję 'nonlocal' oraz' global', zobacz też. –

+0

@TahaJahangir - To dobra uwaga. Dodałem też trochę blurb na "nielokalnym" w mojej odpowiedzi z powodu twojego komentarza. Dzięki! – mgilson

Odpowiedz

31

Każdego „zmienny” w Pythonie jest ograniczona do pewnego zakresu. Zakres "pliku" Pythona to zasięg modułu. Rozważmy następujący:

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

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

Obiekty z zakresu lokalnej umrzeć jak najszybciej wyjść funkcyjnych i nigdy nie może zostać odzyskane (chyba return im), ale wewnątrz funkcji, można uzyskać dostęp do zmiennych w zakresie poziomu modułu (lub każdy zawierający zakres):

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() 

jednak nie można używać przypisanie tego odniesienia i oczekiwać, że będzie propagowane do zewnętrznej zakresie:

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 

Teraz jesteśmy wreszcie na global. Słowo kluczowe global jest sposobem, w jaki mówisz pythonowi, że określona zmienna w twojej funkcji jest zdefiniowana w zasięgu globalnym (na poziomie modułu).

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 

Innymi słowy, można zmienić wartość myvariable w module-zakres od wewnątrz func jeśli używasz słowa kluczowego global.


Tak na marginesie, zakresy można zagnieżdżać dowolnie głęboko:

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() 

Teraz w tym przypadku żadna ze zmiennych zadeklarowana w zakresie globalnym, aw python2, nie ma (proste/clean), aby zmienić wartość x w zakresie func1 z poziomu func3. Dlatego słowo kluczowe nonlocal zostało wprowadzone w python3.x. nonlocal to rozszerzenie global, które pozwala modyfikować zmienną pobraną z innego zakresu w zakresie, w jakim został pobrany.

+0

+1 dla dokładnego wyjaśnienia. Możesz jednak wyświetlić wyniki instrukcji drukowania. –

+0

@StevenRumbalski - Gotowe. Dobry pomysł. – mgilson

+0

Testowałem to po przeczytaniu Twojej odpowiedzi i moje zrozumienie znacznie się poprawiło w tej kwestii. Dziękuję Ci bardzo! – Capurnicus

0

Zasadniczo mówi tłumaczowi, że zmienna podana powinna zostać zmieniona lub przypisana na poziomie globalnym, a nie domyślny poziom lokalny.

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

Można użyć zmiennej globalnej w innych funkcji, deklarując je jako globalne w każdej funkcji, która modyfikuje to

Python chce mieć pewność, że naprawdę wiesz, że to co grasz z jawnie wymagając słowo kluczowe globalne.

Zobacz this answer

1

mgilson wykonał dobrą robotę, ale chciałbym dodać trochę więcej.

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] 

wewnątrz funkcji, Python zakłada każdą zmienną jako zmiennej lokalnej chyba zadeklarować ją jako globalny, czy masz dostęp do zmiennej globalnej.

list1.append(2) 

było możliwe, ponieważ użytkownik uzyskuje dostęp do "listy1", a listy są zmienne.

list2 = [222] 

było możliwe, ponieważ inicjalizujesz zmienną lokalną.

Jednak jeśli Odkomentuj # list1 = [9], dostaniesz

UnboundLocalError: local variable 'list1' referenced before assignment 

Oznacza to, że starają się zainicjować nową zmienną lokalną „lista1”, ale to już odwoływać wcześniej i jesteś poza zakresem, aby go ponownie przydzielić.

Aby wprowadzić zasięg, zadeklaruj "list1" jako globalny.

Gorąco polecam przeczytać this, mimo że na końcu jest literówka.