Подтвердить что ты не робот

В Python что такое глобальное утверждение?

Что такое глобальный оператор ? И как он используется? Я прочитал официальное определение Python;
однако, это не имеет для меня большого смысла.

4b9b3361

Ответ 1

Каждая "переменная" в 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` 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, которое позволяет вам изменять переменную, которую вы выбрали из другой области, в любой области, из которой она была извлечена.

Ответ 2

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' глобальным.

Я настоятельно рекомендую вам прочитать этот, хотя в конце есть опечатка.

Ответ 3

В основном это говорит интерпретатору, что переменная, данная ей, должна быть изменена или назначена на глобальном уровне, а не локальный уровень по умолчанию.

Ответ 4

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

Ответ 5

Вы можете использовать глобальную переменную в других функциях, объявив ее глобальной в каждой функции, которая ее модифицирует.

Python хочет убедиться, что вы действительно знаете, с чем вы играете, явно требуя ключевое слово global.

См. этот ответ