#Python的以函数为界限划分变量范围
#最外层函数以外是全局变量叫做global,
#最内层函数以内是局部变量叫做local,
#其他的叫做nonlocal
#If while for try等不进行作用域Scope划分,和C是有区别的。
a=10#全局
def Fnc1():
b=11#非局部
def Fnc1_1():
c=12#非局部
def Fnc1_1_1():
d=13#局部
if 1:
f=14 #全局的变量
print(f)#正常打印
#print(b)#出错找不到b
#非全局范围访问全局变量,可以不声明
def Fnc10():
print("global f =",f,sep=' ')
#非全局范围修改全局变量,必须要声明
def Fnc11():
f=10#看似修改了f,实则新建了一个local变量f
print("local f =",f,sep=' ')
Fnc11()
print("global f =",f,sep=' ')#真正的全局变量没有变
def Fnc12():
global f #声明全局变量,下面用的就是全局变量了
f=10
print("global f =",f,sep=' ')
Fnc12()
print("global f =",f,sep=' ')#真正的全局变量没有变
#能不能在不声明全局变量的前提下,在非全局下访问全局变量
#并创建一个相同名称的变量并使用
#不行会报错,在一个范围内不能包含相同名称的全局和非全局变量
def Fnc13():
#f=10+f #想用全局变量+10赋给非全局变量,运行报错
print("global f =",f,sep=' ')
Fnc13()
print("global f =",f,sep=' ')#真正的全局变量没有变
#global 可以在任何地方声明一个全局变量,如果这个变量没有就创建
def Fnc14():
global g #声明全局变量,这个全局变量没有,就创建一个,但是后使用时要先赋值再访问,直接访问报错
g=10
Fnc14()
print("global g =",g,sep=' ')#访问到了函数内部创建的全局变量
#全局变量声明能否跨函数
#不能,函数是划分作用域的
def Fnc15():
#global g #声明全局变量,注释掉不报错
def Fnc16():
global g #注释掉报错
g+=10 #不可以直接用,需要再次声明
Fnc16()
Fnc15()
#非局部声明
def Fnc17():
h=11
def Fnc18():
#global h#如果这样声明,显然是新建了一个全局变量h
#h+=10 #不声明同样可以访问不能赋值
print(h)
Fnc18()
Fnc17()
def Fnc19():
h=11
def Fnc20():
nonlocal h#h显然不是全局变量,又不是Fnc20的局部变量,所有叫做非局部
h+=10 #不声明同样可以访问不能赋值
print(h)
Fnc20()
print(h)
Fnc19()
#能不能越界访问非局部
def Fnc21():
h=11
def Fnc22():
h=13
def Fnc23():
nonlocal h#访问的13
h+=10 #不声明同样可以访问不能赋值
print("Fnc23",h,sep=' ')
Fnc23()
print("Fnc22",h,sep=' ')
Fnc22()
print("Fnc21",h,sep=' ')
Fnc21()
#如果22没有变量h那么23会访问21的h,一直向前找找到h为止
def Fnc21():
h=11
def Fnc22():
#h=13
def Fnc23():
nonlocal h#访问的13
h+=10 #不声明同样可以访问不能赋值
print("Fnc23",h,sep=' ')
Fnc23()
print("Fnc22",h,sep=' ')
Fnc22()
print("Fnc21",h,sep=' ')
Fnc21()
#如果非全局中没有变量,那么nonlocal会找到全局中去吗,
#不能,报错,只能在非全局里面找,找不到就报错
p=10
def Fnc21():
def Fnc22():
p=10#屏蔽掉报错
def Fnc23():
nonlocal p
p+=10
print("Fnc23",p,sep=' ')
Fnc23()
print("Fnc22",p,sep=' ')
Fnc22()
print("Fnc21",p,sep=' ')
Fnc21()