函数 名称空间与作用域
### 函数对象
函数名可以被引用
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解释器的启动而存在,关闭而结束
全局名称空间:
当前文件的开始执行而产生,当前页面代码执行结束后失效
局部名称空间:
伴随函数的调用而产生,函数的结束而回收
名称空间的加载顺序
内置名称空间 > 全局名称空间 > 局部名称空间
查找顺序
局部名称空间 > 全部名称空间 > 内置名称空间
函数内部使用的名字,在定义阶段已经规定死了,与调用位置无关
作用域
全局作用域
位于全局名称空间,内置名称空间中的名字属于全局范围,
局部作用域
局部可以调用的名字
- global 声明全局变量
- nonlocal 在局部名称空间声明局部变量,修改上层变量
函数的嵌套
在函数中,无论嵌套多少层,都可以查看全局作用域的名字 在函数内部修改全局名称时空间
的名字的值,当值为不可变类型时,要用global
当实参函数为可变类型时,函数体内对该值的修改将直接反应到原值