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()
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)