函数命名空间和作用域
namespace 命名空间(名称空间)
内置 命名空间: python解释器启动之后就可以使用的变量\函数名
全局 命名空间:在函数外面的变量名\函数名
局部 命名空间: 每一个函数都拥有自己的命名空间
python解释器运行 加载顺序:
所有 内置空间函数名\变量===》逐行 加载全局空间变量\函数名
局部空间的变量\函数名:在调用函数的时候产生,调用结束就消失
例如:
a = 1 a = 3 #a = 3 把 a = 1 覆盖 print(a) def len_c(): pass def len_c(): pass2 print(len_c) # 是pass2 按加载顺序,len_c覆盖
作用域:一个变量\函数名 可以使用的区域
全局作用域: 内置空间 全局空间 的变量名\函数名
局部作用域: 局部空间 变量名\函数名
作用域链:
下级能用上级,反之不能 单向
下级 用 上级 不能 改 (想改的话,global 可以修改全局变量,nonlocal 修改局部变量,当前没有,向上级找,截止最后的局部空间寻找,在找不到,报错)
globals() 保存了全局变量和对应的值
print(globals)
locals() 保存了当前空间变量和对应的值
locals()
命名空间说白了,可以看做一个字典,字典key保存了当前空间的所有变量,,key对应的值就是变量的值
如果想要修改全局的变量:使用global关键字(尽量避免,会把全局相同的变量都给更改,就完蛋了)
如果想要修改外层函数的变量:使用nonlocal(不影响全局)
a = ’ddfdf‘ # a 全局空间 变量 def func1() # func1 全局空间 函数名 print() def func2() #func2 全局空间 函数名 func1 # 局部空间 函数 函数func2内部没有func1,就去上级去找 (作用域链) a = 1 #局部空间 变量 print ()
函数嵌套:
def func() def func1() #函数嵌套 定义 . . func1 #函数嵌套 调用 print(..) -------- n = 0 def func1() n = 1 def func2() n = 2 def func3() n =3 print(n) func3() #调用func3 print(n) func2() #调用 func2 print(n) func1() #调用func1 可以删除变量n 试一试 def func (): a =10 b = 20 print(locals()) #{'b': 20, 'a': 10} func()
global
n = 1 def func() global n n = n + 1 #不仅仅用,还把全局命名空间中的变量n的值修改了 (这种最好不用,太危险) func() print(n) # 2
global和nonloacl
n = 0 def func(): n = 1 def func1(): def func2(): nonlocal n #修改局部变量 func2中没有,向上找func1,也没有,在向上func空间找,有变量n(如果还没有,报错) n += 1 print(n) # 2 func2() func1() func() print(n) # 0 n = 0 def func(): n = 1 def func1(): def func2(): global n #直接去全局找n (如果全局没有,报错) n += 1 print(n) # 1 func2() func1() func() print(n) # 1
golbals() 全局命名空间 的变量和值得集合 是个字典形式
locals() 局部。。。。。。。。。。。。。
======
第一类对象:
函数名可以赋值
可以作为一个数据结构的元素
可以作为一个函数的参数
可以作为一个函数的返回值