函数中的命名空间,作用域

- 函数中的三种命名空间

  - 内置命名空间:在启动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()                     

- 总结:

  - 命名空间:从大范围到小范围有三种,内置命名空间,全局命名空间,局部命名空间

  - 作用域:小范围的可以用大范围的,但大范围的不能用小范围的,范围从小到大

  - 作用域链:在小范围内,如果有变量就用当前小范围有的,如果在小范围没有的,就用上一级的,上一级没有就用上上一级的,以此类推,如果都没有报错

 

 

 

  

 

posted @ 2017-08-31 14:04  JAYWX  阅读(150)  评论(0编辑  收藏  举报