Какво е глобално изявление? И как се използва? Прочетох официалната дефиниция на 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