变量作用域
变量由作用范围来限制,按照作用域分类可分为:
- 全局(global): 在函数外部定义
- 局部(local):在函数内部定义
变量的作用范围:
- 全局变量:在整个全局范围都有效
- 全局变量在局部可以使用(即函数内部可以方位函数外部定义的变量)
- 局部变量在局部范围可以使用
- 局部变量在全局范围无法使用,在局部范围内(比如函数)将局部变量用global函数定义为全局函数,并且调用了此函数后,在全局范围内能调用此局部变量。
LEGB原则
L(Local)局部作用域
E(Enclosing function locale)外部嵌套函数作用域
G(Global module)函数定义所在模块作用域
B(Buildin): python内置魔抗的作用域
global函数
使用global函数可以将局部范围内(比如函数)的局部变量提升为全局变量。
def fun():
global a2
global a3#将a2、a3定义为全局变量
a2=20
print(a2)
a3 =99
print(a3)
#print(a2)调用函数前,调用内部变量a2会报错
fun()#只有在调用此函数后,内部的局部变量才能被调用
print(a2)
print(a3)
20
99
20
99
再举一个例子
b2 = 22#全局变量
def fun():
b2 = 99#局部变量
print(b2)
print(b2)
fun()#函数调用全局变量,输出b2=99
print(b2)#函数内部没定义b2为全局变量,所以依然输出为22
22
99
22
globals, locals函数
可以通过globals和locals显示出局部变量和全局变量,可以从我之前编的汉诺塔程序体会到Locals函数的好处,可以帮助理解递归中,各个变量的赋值变化。
locas函数:
函数功能为,返回当前作用域内的局部变量和其值组成的字典,与globals函数类似(返回全局变量),可用于函数内。函数所返回的字典集合不能修改,不知道能不能将其转换为列表进行更改,下次试试。
def hanoi(n,a,b,c):
if n==1:
print(a,'-->',c)
else:
print(locals())
hanoi(n-1,a,c,b)#
print(locals())
hanoi(1,a,b,c)
print(locals())
hanoi(n-1,b,a,c)
print(locals())
hanoi(3,'A','B','C')
{'c': 'C', 'b': 'B', 'a': 'A', 'n': 3}
{'c': 'B', 'b': 'C', 'a': 'A', 'n': 2}
A --> C
{'c': 'B', 'b': 'C', 'a': 'A', 'n': 2}
A --> B
{'c': 'B', 'b': 'C', 'a': 'A', 'n': 2}
C --> B
{'c': 'B', 'b': 'C', 'a': 'A', 'n': 2}
{'c': 'C', 'b': 'B', 'a': 'A', 'n': 3}
A --> C
{'c': 'C', 'b': 'B', 'a': 'A', 'n': 3}
{'c': 'C', 'b': 'A', 'a': 'B', 'n': 2}
B --> A
{'c': 'C', 'b': 'A', 'a': 'B', 'n': 2}
B --> C
{'c': 'C', 'b': 'A', 'a': 'B', 'n': 2}
A --> C
{'c': 'C', 'b': 'A', 'a': 'B', 'n': 2}
{'c': 'C', 'b': 'B', 'a': 'A', 'n': 3}