函数的命名空间和作用域
命名空间 有三种
内置命名空间 --- python解释器
就是python解释器,一启动就可以使用的名字存储在内置命名空间中
如print(),input()等等....
内置的名字在启动解释器的时候被加载进内存中
全局命名空间 --- 编写的代码,但不是定义函数中的代码
是在程序从上到下被执行的过程中依次加载进内存的
放置了我们设置的所有变量名和函数名
局部命名空间 --- 函数
就是函数内部定义的名字
当调用函数的时候,才会产生这个名称空间,随着函数执行的结束,这个命名空间就消失了
在局部:可以使用全区、内置命名空间中的名字
在全局:可以使用内置命名空间的名字,但是不能使用局部中的名字
在内置命名空:不可以使用全局和局部命名空间的名字---因为它在解释器启动的时候已经开始使用,不依赖用户编写的代码进行启动。
1 在全局 在局部 2 a = 1 # def test(): 3 def test(): # a=1 4 print(a) # print(a) 5 # test() 6 test() # print(a)
依赖倒置原则:内置命名空间A包含全局命名空间B,全局命名空间B里包含局部命名空间C; 即:A>B>C,A为底层,B为中间层,C为上层,c可以从A,B取值,B能取A的值取不了C的值,A取不了BC的值
在正常情况下,直接使用内置的名字 。
当我们在全局定义了和内置名字空间中同名的时候,会使用全局的名字
当本身有的时候,就不找上级的要。
如果自己没有,就找上级要,上级没有再找上级
如果内置命名空间没有,就报错
多个函数应该拥有多个独立的局部命名空间,且互不关联。
1 def max():
2 print(" in max now")
3
4 print(max())
5
6 #进Debug模式查看运行顺序 #不会调用内置的input()
7 def input():
8 print('in input now')
9
10 def test():
11 input()
12
13 test()
作用域 只有两种
全局作用域 --- 作用在全局 --- 内置和全局名字空间中的名字都属于全局作用域---globals(),查看全局域中有什么名字,仅查看,无论放哪里,都时查看全局的。---print(globals())
局部作用域 --- 作用在局部 --- 函数(局部名字空间中的名字属于局部作用域)---locals(),查看作用域中有什么名字,仅查看,如果放在全局,则查看全局的。---print(locals())
对于不可变数据变类型,在局部中是可以查看全局作用域中的变量 但是不能直接修改 。
1 a = 1 2 def test(): 3 a =2 4 return a
5 print(a) 6 a = test() # 调用函数test,将返回值a 赋值到变量a 7 print(a)
如果需要修改,需要函数开始时进行global声明 如果在一个局部函数内生命了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效 。
注意:能不使用global就不用,因为相当于直接修改了原来定义的一个变量
1 a = 1 2 print(a) 3 def test(): 4 global a # 对全局变量a 进行声明,即可调用 5 a += 1 #不可变数据类型的修改 6 return a 7
8 b=test()
9 print(a) # 通过方法global 将全局变量的a进行了修改 10 print(b)
浙公网安备 33010602011771号