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()