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