python------函数嵌套及作用域链

命名空间

命名空间一共分为三种:

  全局命名空间

  局部命名空间

  内置命名空间

下面大家要了解一些底层的原理

  • 全局命名空间:创建的存储“变量名与值的关系”的空间叫做全局命名空间
  •    局部命名空间:在函数的运行中开辟的临时的空间叫做局部命名空间    (随着函数的结束临时空间结束)
  •    内置命名空间:内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。

python文件在建立的时候就会先执行内置空间件在创建的时候就会由python自动为加载进内置空间 py文件内运行代码的时候就会再加载进全局空间 其次才会运行你函数内的局部空间

其实加载的顺序就是

加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

然后才是取值  我们再取值的时候也会有先后顺序的  先去找局部内的值 然后再取寻找全局空间内的值 然后再取找内置空间内的值

取值顺序:

  在局部调用:局部命名空间->全局命名空间->内置命名空间

  在全局调用:全局命名空间->内置命名空间

 

 

作用域

作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

局部作用域:局部名称空间,只能在局部范围生效

1.命名空间和作用域是分不开的
  2.作用域分为两种:
       全局作用域:全局命名空间与内置命名空间的名字都属于全局范围
          在整个文件的任意位置都能被引用,全局有效
    局部作用域:局部命名空间,只能在局部范围内生效   
  3.站在全局看:
    使用名字的时候:如果全局有,用全局的
    如果全局没有,用内置的
  4.为什么要有作用域?
    为了函数内的变量不会影响到全局

5.globals方法:查看全局作用域的名字【print(globals())】

   locals方法:查看局部作用域的名字【print(locals())】

# a= 3
# b =4
# def func1():
#     c= 5
#     d= 6
#     print(globals())  #globals()  是全局变量这就是把全局变量给打印出来
#     print(locals())#这个代表是局部变量 就是把局部变量给打印出来
a= 7
b =9
def funcl():
    d= 10 #这个是局部变量
    print(globals()) #获取全局变量的信息
    print(locals())  #获取局部变量的信息
funcl()
View Code

global关键字,nonlocal关键字。

global是让局部变量能能使用全局变量  而存在的

global:

  1,声明一个全局变量。

  2,在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。  因为列表  字典之类的本身就可以不用global  它本身在全局内 就可以被使用

#     global name   #把name这个局部变量 变成全局变量
#     name ='老男孩'
#     print(name)
# func1()
# print(name)   #因为name已经被global更改位全局变量了 所以我们就可以通过全局的print可以给打印出来
#
# a =4
# def func1():
#     global a  #把全局变量的a给更改了 在局部在用global对一个变量进行操作 就是把局部内变量啊a 也变成全局的  然后局部内的就可以把去全局内的覆盖 就改变了全局的值
#
#     a= 5
# func1()
# print(a)
a = 8
def func():
    global a  #因为这一步已经把这个局部内的变量变成了去全局变量 而全局内又有一个变量  那么我们局部内的变成全局内的变量就可以把这个变量覆盖掉
    a=6
func()
print(a)

 

 

 

 

nonlocal:

 

  1,不能修改全局变量。

  2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改        变。

# nonlocal不能修改全局变量
# def func1():
#     a= 4
#     # print(a)
#
#     def func2():
#         nonlocal a
#         a= 5
#         print(a)
#     func2()  #这个必须有 因为 只是把func2放在在func1中了   还没有调用呢
# func1()
# print(a)

 

posted @ 2018-03-29 20:33  可爱的红领巾  阅读(178)  评论(0编辑  收藏  举报