函数中的命名空间,作用域
- 函数中的三种命名空间
- 内置命名空间:在启动python时,内置命名空间的各参数就已经启动,不管在局部还是在全局,拿过来都能使用的,例如input,print,str,list,tuple...
- 全局命名空间:打开python时,从上到下编写的代码
- 局部命名空间:在遇到函数时,返回函数内部,自上而下加载的代码
- 三种命名空间之间的加载与取值顺序
- 加载顺序:内置命名空间(程序运行前,即打开pycharm就已经运行了)->全局命名空间(程序运行中,自上而下运行)->局部命名空间(当程序中遇到函数时,返回函数中自上而下的运行)
- 取值顺序: 局部->全局->内置
- 根据命名空间由生的作用域
- 作用域即作用空间,就是生效范围,可分为局部作用域,全局作用域
- 全局作用域:包含内置命名空间,全局命名空间,即在整个文件中任意位置使用都有效
- 局部作用域:局部命名空间,即只有在局部作用域内生效
作用域:站在范围小的局部,如果局部有用局部,局部没有往上一层找,一层一层往上找,找到第一个可用的名字就用这个
- globals 和 locals 方法
- globals 查看全局命名空间的参数,在全局作用域内还是在局部作用域内使用,都看的是全局作用域内的参数
- locals 查看局部命名空间的参数,只用在局部作用域内才能看到局部作用域内的参数
- global 关键字:即在局部作用域内更改全局这作用域中的参数
a=10 def func(): global a a= 20 print(a) func() print(a)
- nonlocal 关键字:只修改局部命名空间里的 从内部往外部找到第一个对应的变量名
- 外部必须有这个要修改的变量
- 在内部函数声明nonlocal变量前不能再出现同名变量,即此修改的变量必须是外层中的变量
- 内部修改的此变量,在外部函数中第一次出现次变量中生效
- 函数的嵌套与作用域链
- 作用域链:站在范围小的局部,如果局部中有用局部,局部没有,往上一层找,一层一层往上找,找到第一个可用的名字就用这个,没有就一直找到最外层,即找到全局作用域
- 函数名本质:函数名本质就是函数的内存地址,即就是个变量,调用时加上()就是函数
- 可以被引用
- 可以当做任何形式的容器类型的元素
- 可以当做函数的参数与函数的返回值,即可以把函数名在另一个函数中运行
- 闭包函数:内部函数中没有参数,只有在它的外部函数中有,此函数称为闭包函数
- 外部函数中返回内部函数的函数名 ,即在函数外部可以直接调用内部函数,这就是闭包函数的最常用法
def wrapper(): money=1000 def func(): name='eva' def inner(): print(name,money) return inner return func f=wrapper() i=f() i()
- 总结:
- 命名空间:从大范围到小范围有三种,内置命名空间,全局命名空间,局部命名空间
- 作用域:小范围的可以用大范围的,但大范围的不能用小范围的,范围从小到大
- 作用域链:在小范围内,如果有变量就用当前小范围有的,如果在小范围没有的,就用上一级的,上一级没有就用上上一级的,以此类推,如果都没有报错