一、命名空间
在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