python 基础(函数 命名空间和作用域,嵌套和作用域链,闭包)

时间:2021-08-14 22:45:48

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()