名称空间:
python解析器执行时,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录在内存空间中,这个空间叫全局命名空间
如果遇到函数,只把函数名读入内存,当执行函数时,解析器会在在内存中创建一个临时king见,然后执行函数内部程序,
函数结束时,临时空间消失,开辟的临时的空间叫做局部命名空间
命名空间分为三种:
①全局命名空间
②局部命名空间
③内置命名空间
加载顺序:内置、全局、局部
取值顺序:局部、全局、内置
作用域:
全局作用域:包含内置名称空间、全局名称空间,在任意位置都能被引用,作用于全局
局部作用域:只有函数内部可以调用
globals和locals方法:
name = 'wusir'def func(): name = 'alex' print(globals()) print(locals())func()#{'__name__': '__main__', '__doc__': None,.................' 全局#{'name': 'alex'} 局部
函数嵌套练习:
print(111)def fun2(): print(222) def fun3(): print(666) print(444) fun3() print(888)print(333)fun2()print(555)输出:1 3 2 4 6 8 5
global关键字,nonlocal关键字:
global()声明一个全局变量,在函数中声明,全局都可以使用(限于数字和字符串)
a = 2def func(): global a a = 3func() print(a) #在函数内部声明的a 作用于全局,覆盖函数之前的值,如果在函数下面声明 a = 5, 那么输出5#输出:3
如果为可变数据类型,则不需要加global
l1 = [1,2,3]def func(): l1.append(444)func()print(l1)#输出:[1, 2, 3, 444]
nonlocal:不能修改全局变量
在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变
a = 1def func(): nonlocal a a = 2 print(a)func()#报错,因为nonlocal只能在函数中修改他的父级,由于他的父级是全局,所以报错
def func(): name = 'A' def inner(): nonlocal name name = 'B' print(name) print(name) inner() print(name) #由于此层级的name已经被 nonlocal 改变了值,所以输出Bfunc()#输出: A B B