函数 名称空间与作用域

### 函数对象

  • 函数名可以被引用

    def add(x, y):
        return x + y
    func = add
    print(func(1, 2))
    3
  • 函数名可以当做参数引用

def foo(x, y, func):
    print(x, y)
    func()
def bar():
    print('from bar')
foo(1, 2, bar)

1 2
from bar
  • 函数可以当作返回值使用
def index():
    print('from index')
def func(a):
    return a
a = func(index)
a()
  • 函数名可以当做容器类型的元素
def func():
    print('from func')
l1 = [1, '2', func, func() ]
f = l1[2]
print(f)
from func
<function func at 0x000002C52CC14288>

### 名称空间

  • 内置名称空间

    python提前定义好的名字

  • 全局名称空间

    存放于文件级别的名字,就是全局名称空间

  • 局部名称空间

    函数内部定义的所有名字都存放于当前函数的内置名称空间

    名称空间 就是存放名字与对象映射/绑定关系的地方

    内置名称空间:

​ 伴随python解释器的启动而存在,关闭而结束

全局名称空间:

​ 当前文件的开始执行而产生,当前页面代码执行结束后失效

​ 局部名称空间:

​ 伴随函数的调用而产生,函数的结束而回收

名称空间的加载顺序

​ 内置名称空间 > 全局名称空间 > 局部名称空间

查找顺序

​ 局部名称空间 > 全部名称空间 > 内置名称空间

​ 函数内部使用的名字,在定义阶段已经规定死了,与调用位置无关

作用域

  1. 全局作用域

    位于全局名称空间,内置名称空间中的名字属于全局范围,

  2. 局部作用域

​ 局部可以调用的名字

  • global 声明全局变量
  • nonlocal 在局部名称空间声明局部变量,修改上层变量

函数的嵌套

​ 在函数中,无论嵌套多少层,都可以查看全局作用域的名字 在函数内部修改全局名称时空间

​ 的名字的值,当值为不可变类型时,要用global

​ 当实参函数为可变类型时,函数体内对该值的修改将直接反应到原值

02-01 00:33