python 命名空间 global 和 nonlocal

 

practice

命名空间

   命名空间的分类:

    1)全局命名空间: >>在py文件中,在函数外声明的变量都属于全局命名空间

    2)局部命名空间: >>在自定义函数中声明的变量是局部命名空间

    3)内置命名空间: >>存放在python解释器为我们提供的名字中,

              如: list, tuple, str, int 这些都是内置命名空间

a = 10 # 全局名称空间中的内容
def fn(): # fn也在全局名称空间
    b = 20 # 局部名称空间
    print(a)  #不能改变a的值,但是可以查看
def gn():
    print(a)
fn()   #10
gn()   #10

   加载顺序:

    内置命名空间 >> 全局命名空间 >> 局部命名空间 (函数调用时)

  取值顺序:

    局部  >>  全局  >>  内置

取值顺序:
1
a=10 2 def fun(): 3 a=20 4 print(a) 5 fun() #20

 作用域:

  1) 全局作用域:  全局命名空间 + 内置命名空间

  2) 局部作用域:  局部命名空间

 可以通过 globals() 函数查看全局作用域的内容,也可以通过 locals() 来查看局部作用域中的变量和函数信息.

1 a = 110 # 全局
2 def fn(): #
3     b = 20 # 局部
4     def gn(): # 局部
5         print(globals())  # 可以查看全局作用域中的内容
6         print(locals())  # 查看当前作用域中的内容
7     gn()
8 fn()

函数的嵌套

  1) 只要遇见了 () 就是函数的调用, 没有 () 就不是函数的调用.

  2) 函数执行的顺序 

 1 def outer():
 2     print("哈哈")
 3     def inner_1():
 4         print("呵呵")
 5         def inner_1_1():
 6             print("嘻嘻")
 7         inner_1_1()
 8         print("吼吼")
 9     def inner_2():
10         print("嘿嘿")
11     inner_2()
12     inner_1()
13 outer()
14 #哈哈  嘿嘿 呵呵 嘻嘻  吼吼

 global  和  nonlocal

  glocal 是将全局变量引入函数内部

1 a = 10 # 全局变量本身就是不安全的, 不能随意修改
2 def func():
3     global a  # 1. 可以把全局中的内容引入到函数内部 , 2. 在全局创建一个变量
4     # a = 20
5     a += 10 # a = a+10
6     print(a)  #20
7 func()

   nonlocal 是寻找外层函数中离他最近的那个变量,  不包含全局变量

1 func()
2 print(a)
3 a = 10
4 def outer():#
5     def inner(): # 在inner中改变a的值
6         nonlocal a # 寻找外层函数中离他最近的那个变量
7         a = 20
8     inner()
9 outer()

 小题:

 1 a = 1
 2 def fun_1():
 3     a = 2
 4     def fun_2():
 5         nonlocal a
 6         a = 3
 7         def fun_3():
 8             a = 4
 9             print(a)
10         print(a)
11         fun_3()
12         print(a)
13     print(a)
14     fun_2()
15     print(a)
16 print(a)
17 fun_1()
18 print(a)
19 # 1  2  3  4  3  3  1

 

posted @ 2018-08-09 16:33  葡萄想柠檬  Views(207)  Comments(0Edit  收藏  举报
目录代码