函数的命名空间和作用域

命名空间 有三种
内置命名空间 --- 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)

 

posted on 2019-02-11 15:53  Jerry-Wang  阅读(198)  评论(0)    收藏  举报