Python基础学习12--变量作用域
变量作用域
- 变量有作用范围限制
- 分类:按照作用域分类
- 全局(global):在函数外部定义
- 局部(local):在函数内部定义
- 变量的作用范围:
- 全局变量:在整个全局范围都有效
- 全局变量在局部可以使用(即函数内部可以方位函数外部定义的变量)
- 局部变量在局部范围可以使用
- 局部变量在全局范围无法使用
- LEGB原则
- L(Local):局部作用域
- E(Enclosing function locale):外部嵌套函数作用域
- G(Global module):全局作用域
- B(Buildin): 内置作用域(内置函数所在模块的范围)
- 以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。
# a1是全局变量 a1 = 100 def func1(): print(a1,"a1在函数内") # a2的作用范围是函数func1内 a2 = 99 print(a2,' a2也在函数内') print(a1) print('-' * 15) func1() print('-' * 15) print(a2)
输出结果如下:
100 --------------- 100 a1在函数内 99 a2也在函数内 --------------- NameError: name 'a2' is not defined # 因为a2是函数体内的局部变量,所以在外部调用时会报错!
如果函数外部想要调用函数内部的变量,此时则需要将局部变量升级为全局变量
def func2(): global b1 # globa的作用时将局部变量转为全局变量----global一定要放在变量 b1 之前 b1 = 100 print(b1,'b1在函数内') # print(b1) # 如果在调用函数前,输出b1,则会报错,因为函数在未调用前,python是不会执行函数体,因此在python看来,b1是未定义的变量 func2() print('-' * 15) print(b1,'b1可以在函数外了')
输出结果如下:
100 b1在函数内
---------------
100 b1可以在函数外了