1,函数命名空间和作用域
1,命名空间
内置命名空间: -----python解释器 print() input() list tuple
就是python解释器一启动就可以使用的名字存储在内置命名空间中
内置的名字在启动解释器的时候被加载进内存里
全局命名空间-----我们写的代码但不是函数中的代码
是在程序从上到下被执行的过程中依次加载进内存中
放置了我们设置的所有变量名
局部命名空间-----函数
就是函数内部定义的名字
当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就消失了
在局部:可以使用全局,内置命名空间中的名字
在全局:可以使用内置命名空间中的名字,但是不能使用局部中使用
在内置:不能使用局部和全局的名字
在正常情况下,直接使用内置名字
当我们在全局定义了和内置名字空间中同名的名字,会使用全局名字
当自己有的时候 就不会找上级要了 内置没有就报错
2,作用域
全局作用域---作用在全局---内置和全局名字空间中的名字都属于全局作用域---globals()
局部作用域---作用在局部---函数(局部名字空间中的名字属于局部作用域)---locals()
a = 1 b = 2
def func() x = 'aaa' y = 'bbb'
print(locals()) func() print(globals())# 永远打印全局的名字
print(locals()) #本地的 输出什么,根据 locals所在位置
2,函数的嵌套和作用域链
1,函数的嵌套----内部函数可以使用外部函数的变量
a = 1
def outer(): a = 1
def inner(): a = 2
def inner2(): nonlocal a #声明了一个上面第一层局部变量,离当前最近一层
a += 1 #不可变数据类型的修改
inner2() print('##a## : ', a) inner() print('**a** : ',a) outer() print('全局 :',a)
函数名:----本质是一串内存地址
func() 是内存地址
func2 = func 可以赋值
l = [func,func2] 可作为容器类型的元素
return f 可作为函数的返回值
qqxing = wahaha(func) 可作为函数的参数
2,作用域链:
小范围用变量的时候,先从自己的名字空间找,
找不到就一层一层向外层找,知道找到为止。 找不到就报错。
3,闭包---内部函数使用外部函数的变量
def outer(): a = 1
def inner(): print(a) return inner i = outer() i()