#变量作用域
-变量有作用范围限制
-分类:按照作用域分类
-全局(global):在函数外部定义
-局部(local):在函数内部定义
-变量的作用范围:
-全局变量:在整个全局范围都有效
-全局变量在局部可以使用(即函数内部可以访问函数外部定义的变量)
-全局变量在局部范围可以使用
-局部变量在全局无法使用
-LEGB原则: -L(Local):局部作用域
-E(Enclosing function locale):外部嵌套函数作用域
-G(Global module):函数定义所在模块作用于
-B(Buildin):Python内置模块的作用于
#a1是全局的 a1 = 100 def fun(): print(a1) print("I am fun") #a2的作用域范围是fun a2 = 99 print(a2) print(a1) fun() # print(a2)无法访问a2
提升局部变量为全局变量
#b1是全局的 b1 = 100 def fun(): #提升b2为全局变量 global b2 print(b1) print("I am fun") b2 = 90 print(b2) print(b1) fun() print(b2)
运行结果:
100
100I am fun9090#globals, locals 函数
-可以通过globals和locals显示出局部变量和全局变量
-参看以下案例:
#globals 和llcals a = 1 b = 2 def fun(c, d): e = 111 print("Locals = {0}".format(locals())) print("Globals = {0}".format(globals())) fun(100, 200) Locals = { 'e': 111, 'd': 200, 'c': 100} Globals = { '__name__': '__main__', '__doc__'...} #eval()函数 -把一个字符串当成一个表达式来执行,返回表达式执行后的结果 语法: eval(string_code, globals=None, locals=None)
#eval x = 100 y = 200 z1 = x + y z2 = eval("x+y") print(type(z1)) print(z1) print(type(z2)) print(z2) 运行结果:300 300
#exec -跟eval功能类似,但是,不返回结果 -语法: exec(string_code, globals=None, locals=None)
#exec x = 100 y = 200 z1 = x + y z2 = exec("print('x+y:', x+y)") z3 = exec("x+y") print("z1", type(z1)) print("z1:", z1) print("z2", type(z2)) print("z2", z2) print("z3", type(z3)) print("z3", z3)
运行结果: x+y: 300 z1z1: 300 z2 z2 None z3 z3 None #递归函数 -函数直接或者间接调用自身 -优点:简洁, 理解容易 -缺点:对递归深度有限制,消耗资源 -python对递归深度有限制,超过限制报错 -再写递归程序的时候,一定注意结束条件
x = 0 def fun(): global x x = x + 1 print(x) #函数自己调用自己 fun() fun() . .. .... RecursionError: maximum recursion depth exceeded while calling a Python object