Что такое глобальный оператор ? И как он используется? Я прочитал официальное определение Python;
однако, это не имеет для меня большого смысла.
В Python что такое глобальное утверждение?
Ответ 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.
См. этот ответ