Что такое глобальное заявление? И как это используется? Я прочитал официальное определение Python;
однако , это не имеет большого смысла для меня.
Что такое глобальный оператор в Python?
Ответы (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
, позволяющее изменять переменную, полученную из другой области видимости, в любой области, из которой она была извлечена.
global
считается плохой идеей, поскольку это затрудняет инкапсуляцию вашей логики. Лучший способ сохранить данные между вызовами функций — использовать class
es, что вы, вероятно, захотите изучить, если будете придерживаться 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 глобальным.
Я настоятельно рекомендую вам прочитать это, хотя в конце есть опечатка.
По сути, он сообщает интерпретатору, что данная переменная должна быть изменена или назначена на глобальном уровне, а не на локальном уровне по умолчанию.
Вы можете использовать глобальную переменную в других функциях, объявив ее глобальной в каждой функции, которая ее изменяет.
Python хочет убедиться, что вы действительно знаете, с чем вы играете, явно запрашивая ключевое слово global.
См. этот ответ
nonlocal
вместе сglobal
, смотрите его тоже. - person Taha Jahangir   schedule 14.12.2012nonlocal
в свой ответ из-за вашего комментария. Спасибо! - person mgilson   schedule 14.12.2012