python notice7 命名空间和函数嵌套

一、命名空间

  在python解释器开始执行之后,会在内存中开辟一个空间,每当遇到一个变量的时候,就会把变量名和值之间的关系记录下来,但是当遇到函数定义的时候,解释器先把函数名读入到内存中,不管函数内部的变量和逻辑。当函数被调用和访问时,解释器才会根据函数内部声明的变量来开辟变量的内部空间,随着函数执行完毕,这些函数内部变量占用的空间也会随着函数执行完毕而被释放。

  命名空间:存放变量的名字和值的空间。

命名空间分类:

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

  2.局部命名空间:在函数中声明的变量会放在局部命名空间。

  3.内置命名空间:存放python解释器内置函数或者变量的空间。

加载顺序:

  1.内置命名空间。

  2.全局命名空间。

  3.局部命名空间。(函数被执行时)

取值顺序:

  1.局部命名空间。

  2.全局命名空间。

  3.内置命名空间。

二、作用域:作用范围

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

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

  可通过globals()函数查看全局作用域中的内容;通过locals()函数查看局部作用域中的变量和函数信息。

a = 10
def func():
    a = 40
    b = 20
    print(globals()) # 打印全局作⽤用域中的内容
    print(locals()) # 打印局部作⽤用域中的内容
func()

三、函数的嵌套

  在函数内部定义函数,并调用。

#函数的嵌套
def fun1():
    print(222)
    def fun2():
        print(666)
    print(444)
    fun2()
    print(888)
print(333)
fun1()
print(555)

关键字global和nonlocal使用:

  global:在函数内部引入全局变量,同时可以修改全局变量。

  nonlocal:在函数内部中,内层函数访问外层函数中的局部变量,也可以对其修改。

a = 100
def func():
    global a     #引入全局变量a
    a = 28      #修改全局变量a                 
    print(a)     #28
func()
print(a)    #28
a = 10
def func1():
    a = 20
    def func2():
        nonlocal a    #引入父级函数变量
        a = 30         #修改父级函数变量
        print(a)
    func2()
print(a)    #10
func1()    #30           

 

posted @ 2019-07-23 10:35  小路_fan  阅读(133)  评论(0编辑  收藏  举报