py12-函数命名空间-作用域
1、名称空间
就是存放名字的地方,准确的说名称空间是存放的名字与变量值绑定关系的地方。
示例:之前定义的变量x=1,1存放在内存中,那名字x存放在哪里?名称空间正是存放名字x与1绑定关系的地方。
2、名称空间分类
分为三种:
内置名称空间:python自带的,如print、if、len、在python解释器时产生,存放一些python内置的名字。
全局名称空间:在执行文件时产生,存放文件级别定义的名字。放置位置:没有缩进或者不是内置的,不在函数内部定义的就是全局名称空间。
局部名称空间:在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间,用来存放函数内定义的名字,该名字在函数调用时生效,崽函数调用结束后失效。
3、名称空间顺序
加载顺序:
内置名称空间 -> 全局名称空间 -> 局部名称空间
名字的查找顺序:
局部名称空间 -> 全局名称空间 -> 内置名称空间
在全局是无法看到局部的,在局部可以查看全局的。
4、示例
x=0 def f1(): x=1 def f2(): x=2 def f3(): x=3 print(x) f3() f2() f1()
5、作用域
作用域即范围
6、作用域分类
全局作用域:全局存活,全局有效 ,用globals()来表示
局部作用域:临时存活,只在局部有效,局部内访问,用locals()来表示
作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关。
7、查看局部作用域
def f1(): x=1 y=2 def f2(): pass print(locals()) f1()
结果如下:
{'y': 2, 'f2': <function f1.<locals>.f2 at 0x00000000006EE1E0>, 'x': 1}
8、查看全局作用域
x=123 def f1(): x=1 y=2 def f2(): pass print(globals()) f1()
结果:在全局里面看只能看到全局的作用域
9、global nonlocal 两个关键字
x=1 def f1(): x=2 f1() print(x)
(调用的全局的名称空间,局部的不会替换全局的,全局的是不可变类型)
修改全局变量的值 global
x=1 def f1(): global x x=2 f1() print(x)
(声明x=2就是全局的名称空间)
l=[] def f2(): l.append('f2') f2() print(l)
#全局的可变类型,可以直接修改
x=0 def f1(): x=1 def f2(): x=2 def f3(): global x x=3 f3() f2() f1() print(x)
#指定x=3为全局的变量,一步到位
nonlocal修改的是当前的上一层的内部函数,只在局部有效
def f1(): x=1 def f2(): x=2 def f3(): nonlocal x x=3 f3() print(x) f2() f1()
www.sysgit.com