变量的作用域
1 ''' 2 变量的作用域概念:变量可以正常使用的范围。 3 变量并不是在当前文件的任意位置均可使用,访问的权限范围取决于该 4 变量定义的位置。 5 6 注意:在Python中,模块(module)、类(class)、函数(def)会产生新的作用域, 7 在这些代码块中定义的变量,在其他位置也不能使用。其他的代码块, 8 如if、for、while、try,不会引入新的作用域,在这些代码块中定义的变量, 9 在其他位置也可以使用。 10 11 变量的作用域分类: 12 B(built-in) 内建作用域 13 G(Global) 全局作用域 14 E(Enclosing) 闭包作用域 15 L(Local) 局部作用域 16 变量的查找规则: L -> E -> G -> B :先从局部查找, 17 找到直接使用,找不到去闭包中找,找到直接使用, 18 找不到去全局中找,找到直接使用,找不到去内建中找, 19 找到直接使用,找不到报错。 20 21 作用域范围从大到小排列: B -> G -> E -> L 22 ''' 23 if 1: 24 a = 10 25 print(a) # 10 26 print(a) # 10 27 28 def func1(): 29 b = 20 30 print(b) # 20 31 func1() 32 # print(b) # NameError: name 'b' is not defined 33 34 ''' 35 dir() # Builtins python的内建函数:能够使用的范围为内建作用域 36 # 内建函数/内建变量(内建变量或函数属于python语言环境范围的变量或函数)。 37 38 dir = 1 # Global 全局作用域 全局变量 在当前文件的任意位置均能使用 39 def outerFunc(): 40 dir = 2 # Enclosing 闭包作用域 在闭包范围内使用 41 def innerFunc(): 42 dir = 3 # Local 局部作用域 只能在该局部范围内使用 43 return innerFunc 44 45 def func(): 46 dir = 4 # Local 局部作用域 只能在该局部范围内使用 47 ''' 48 49 num1 = 100 # 全局 50 # print(num1) 51 def func2(): 52 # 当定义了一个局部范围的变量,该变量名称与全局变量的名称相同时, 53 # 全局变量与局部变量互不影响。 54 # 但如果在局部范围定义了一个与全局同名的变量时,在局部范围内使用的是 55 # 该局部变量,只能在声明之后使用。 56 # print("3 ==", num1) # 错误 57 num1 = 200 58 print("2 ==",num1) # 200 59 60 func2() 61 print("1 ==",num1) # 100 62 63 64 num2 = 300 # 全局 65 num3 = 444 66 def func3(): 67 # 如果需要在局部范围修改全局范围变量,需要使用global修饰 68 # 该全局变量。 69 # 语法规则: global 变量名 70 # 使用global关键字修饰的变量为全局变量,该局部范围直接可以获 71 # 取及修改全局变量。当同时使用多个全局变量时,使用 逗号 (,) 隔开 72 # 注:使用global关键字,需要放在函数的最上方,函数的最开始位置。 73 global num2, num3 74 num2 = 500 # 全局变量 75 print(num2) # 500 76 77 func3() 78 print(num2) # 500 79 80 81 # 修改嵌套作用域变量使用nonlocal关键字修饰变量。 82 # 语法规则: nonlocal 变量名 83 # num4 = 666 # 全局 84 print('--------------------------') 85 def outer(): 86 num = 111 87 def inner(): 88 nonlocal num 89 num = 333 90 print('inner==', num) # 333 91 inner() 92 print('outer==', num) # 333 93 outer() 94 95 96 # 97 def f1(): 98 num = 111 99 def f2(): 100 nonlocal num 101 num = 222 102 def f3(): 103 nonlocal num 104 num = 333 105 print("3:",num) # 333 106 f3() 107 print("2:", num) # 333 108 f2() 109 print("1:", num) # 333 110 f1() 111 112 113 print("-----------------") 114 a = 10 115 def f4(): 116 global a 117 a = 20 118 def f5(): 119 global a 120 a = 30 121 print('5:', a) # 30 122 f5() 123 print('4:',a) # 20 124 f4() 125 print("aaa: ", a) # 30