变量的作用域

  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

 

posted @ 2019-07-29 19:47  巨菜的小鸟  阅读(170)  评论(0编辑  收藏  举报