Python Day 10 函数(名称空间,作用域,作用域链,加载顺序等; 函数的嵌套 global,nonlocal)

Python Day 10  函数(名称空间,作用域,作用域链,加载顺序等; 函数的嵌套 global,nonlocal)

 名称空间(命名空间):

当程序运行时,代码从上至下一次读取,遇到变量与值
他会在内存中开辟一个空间,存放变量与值的内存地址的对应关系
这样存储变量与值得对应关系的空间叫做名称空间(命名空间)。

内置名称空间

  内置名称空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。
    

全局名称空间

       代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间


局部名称空间

   当解释器遇到函数时,他会将函数名存储在内存中,但是对于函数体漠不关心。
   当函数执行时,他会通过函数名找到函数体,然后将函数体里面的变量等对应关系存放在一个
   临时开辟的空间中,随着函数的结束,临时的空间关闭,这样的空间叫做局部命名空间

加载顺序:

  内置名称空间 ---> 全局名称空间(程序运行时) ---->局部名称空间(函数执行时)

作用域:   

  全局作用域:内置名称空间 全局名称空间
  局部作用域:局部名称空间

L local
E eclose
G global
B Built-in

取值顺序(单项):

  局部名称空间(函数执行时) ---> 全局名称空间 ---> 内置名称空间

  在局部调用:局部命名空间->全局命名空间->内置命名空间

  在全局调用:全局命名空间->内置命名空间

  在找寻变量时,从小范围,一层一层到大范围去找寻。

 

函数的作用域链:

  小范围作用域可以使用大范围的变量,但是反之不行,他是单向的。

sum = 666  # global

def func1():
    sum = 555  # eclose
    print(sum)
    def inner():
        pass
        sum = 111   # local
        # print(sum)
    inner()

func1()

 

global,nonlocal

global

如何在全局名称空间里得到局部名称空间的变量
  1,return
  2,global
    1,在局部作用域中声明一个全局变量。
    2,在局部作用域中,更改一个全局变量。
    补充:
    对于可变的数据类型,函数中如果对其进行操作,改变全局不用引用global. (append,pop....)

 

l1 = [1, 2, 3]
def func1():
    l1.append(666)
func1()
print(l1)

 

nonlocal

  1,不能改变一个全局变量。
  2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,
   并且引用的哪层,从那层及以下此变量全部发生改变。

def func1():
    name = 'alex'
    print(name)  # 1, alex
    def inner():
        nonlocal name
        name = '老男孩'
        print(name)  # 2 老男孩
    inner()
    print(name)  # 3,alex 老男孩
func1()
def add_b():
    b = 42
    def do_global():
        b = 10  # 这一层
        print(b)  # 1,10
        def dd_nonlocal():
            nonlocal b
            b = b + 20
            print(b)  # 2,30
        dd_nonlocal()
        print(b)  # 3,30
    do_global()
    print(b)  #4,42
add_b()
posted @ 2018-05-10 15:33  eailoo  阅读(144)  评论(0编辑  收藏  举报