Что такое глобальный оператор в 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 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