zoukankan      html  css  js  c++  java
  • 变量的作用域

      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
  • 相关阅读:
    2018QBXT刷题游记(4)
    洛谷 P4302 字符串折叠 题解
    hdu5009 Paint Pearls 题解
    CF467C George and Job 题解
    洛谷P2622 关灯问题II 题解
    洛谷 P3049园林绿化 题解
    洛谷 P1064 金明的预算方案 题解
    洛谷P1979 华容道 题解
    2018QBXT刷题游记(3)
    2018QBXT刷题游记(2)
  • 原文地址:https://www.cnblogs.com/BKY88888888/p/11266055.html
Copyright © 2011-2022 走看看