В Python какво е глобално изявление?

Какво е глобално изявление? И как се използва? Прочетох официалната дефиниция на Python;
обаче , за мен няма много смисъл.


person Capurnicus    schedule 14.12.2012    source източник
comment
само забележка, 2.4 е стара версия на python, действителната препратка за python 2 .X версията е тук   -  person Cédric Julien    schedule 14.12.2012
comment
Python 3 идва с нов оператор nonlocal заедно с global, вижте го също.   -  person Taha Jahangir    schedule 14.12.2012
comment
@TahaJahangir -- Това е добра точка. Добавих също малко резюме на nonlocal в отговора си заради вашия коментар. Благодаря!   -  person mgilson    schedule 14.12.2012


Отговори (4)


Всяка „променлива“ в Python е ограничена до определен обхват. Обхватът на "файл" на Python е обхватът на модула. Помислете за следното:

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

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

Обектите с локален обхват умират веднага щом функцията излезе и никога не могат да бъдат извлечени (освен ако не ги return), но в рамките на дадена функция можете да получите достъп до променливи в обхвата на ниво модул (или всеки съдържащ обхват):

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

Въпреки това не можете да използвате присвояване на тази препратка и да очаквате, че тя ще бъде разпространена до външен обхват:

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

Сега най-накрая стигнахме до global. Ключовата дума global е начинът, по който казвате на python, че определена променлива във вашата функция е дефинирана в глобалния обхват (на ниво модул).

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

С други думи, можете да промените стойността на myvariable в обхвата на модула от func, ако използвате ключовата дума global.


Като настрана, обхватите могат да бъдат вложени произволно дълбоко:

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

Сега в този случай нито една от променливите не е декларирана в глобалния обхват и в python2 няма (лесен/чист) начин да промените стойността на x в обхвата на func1 от func3. Ето защо ключовата дума nonlocal беше въведена в python3.x. nonlocal е разширение на global, което ви позволява да модифицирате променлива, която сте взели от друг обхват, независимо от обхвата, от който е изтеглена.

person mgilson    schedule 14.12.2012
comment
+1 за изчерпателното обяснение. Въпреки това може да искате да покажете резултатите от отчетите за печат. - person Steven Rumbalski; 14.12.2012
comment
@StevenRumbalski -- Готово. Добро предложение. - person mgilson; 14.12.2012
comment
Тествах това сам, след като прочетох отговора ви и разбирането ми значително се подобри по този въпрос. Благодаря ти много! - person Capurnicus; 14.12.2012
comment
@user1901780 -- Също така си струва да се отбележи, че повечето от времето споделянето на данни чрез global се смята за лоша идея, тъй като прави по-трудно капсулирането на вашата логика. По-добрият начин да запазите данните между извикванията на функции е да използвате classes, което вероятно ще искате да научите, ако се придържате към python достатъчно дълго :) - person mgilson; 14.12.2012

mgilson свърши добра работа, но бих искал да добавя още.

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]

Вътре във функция Python приема всяка променлива като локална променлива, освен ако не я декларирате като глобална или имате достъп до глобална променлива.

list1.append(2) 

беше възможно, защото имате достъп до „списък1“, а списъците са променливи.

list2 = [222]

беше възможно, защото инициализирате локална променлива.

Ако обаче декоментирате #list1 = [9], ще получите

UnboundLocalError: local variable 'list1' referenced before assignment

Това означава, че се опитвате да инициализирате нова локална променлива 'list1', но тя вече е била спомената преди и сте извън обхвата да я преназначите.

За да влезете в обхвата, декларирайте 'list1' като глобален.

Горещо ви препоръчвам да прочетете това, въпреки че накрая има правописна грешка.

person YOUNG    schedule 26.04.2015

По принцип той казва на интерпретатора, че дадената променлива трябва да бъде модифицирана или присвоена на глобално ниво, а не на локално ниво по подразбиране.

person Jakob Bowyer    schedule 14.12.2012

Можете да използвате глобална променлива в други функции, като я декларирате като глобална във всяка функция, която я модифицира

Python иска да се увери, че наистина знаете, че това е, с което си играете, като изрично изисква ключовата дума global.

Вижте този отговор

person vivek    schedule 14.12.2012