python学习笔记 day10 函数进阶
函数命名空间:---内置命名空间;全局命名空间;局部命名空间
内置命名空间--在python解释器启动时将名字加载到内存中,比如print len str等;
全局命名空间:程序从上往下一行一行执行时把变量名和函数名加载到内存;
局部命名空间:调用函数时,函数内部的变量加载到内存,程序执行结束后,该局部命名空间会消失,不同的局部命名空间之间互相独立;
在局部命名空间中可以使用全局命名空间和内置命名空间中的变量;
在全局命名空间中可以使用内置命名空间中的变量,但不能用局部命名空间中的变量;
但是在内置命名空间中不可以使用局部命名空间或者内置命名空间中的变量;
如果在局部命名空间中查找一个名字,首先查看该局部命名空间是否有,没有去上级(全局命名空间)查找,没有再去上级(内置命名空间)查找,则没有则报错;
作用域---全局作用域 和 局部作用域
全局作用域包括内置命名空间和全局命名空间中的变量;
局部作用域包括局部命名空间中的变量;
若一个变量定义在全局作用域,且是不可变数据类型,则在局部作用域只可以进行查看,不可以直接修改;
要想修改,需要加globa 关键字:
a=1 #全局作用域中的变量,不可变数据类型int def func(): a+=1 print(a) func() print(a)
但是我们可以在局部作用域中使用global关键字来修改全局作用于中的不可变数据类型的值:
a=1 #全局作用域中的变量,不可变数据类型int def func(): global a #局部作用域中对全局变量a的修改会影响该全局变量的值(不建议使用global) a+=1 print(a) func() print(a)
但如果定义在全局作用域中的是一个可变数据类型,在局部作用域可以修改~(自己尝试的):
a=[1,2,3] #全局作用域中的变量,不可变数据类型int def func(): global a #局部作用域中对全局变量a的修改会影响该全局变量的值(不建议使用global) a.append(8) print(a) func() print(a)
运行结果:
golbals: 查看全局作用域中变量;
locals()---与所放位置有关,在全局作用于,查看全局变量,在局部作用域查看局部变量;
a=1 def func(): b=1 c=2 print(locals()) #locals()放在局部作用域可以查看该局部作用域中的局部变量; func() print(globals()) #查看该全局作用域中的全局变量 print(locals()) #Locals()放在全局作用域,同样是查看全局作用域中的全局变量(此时和globals()一样,因为locals()本地的,与所放位置有关)
talk is cheap,show me the code