python函数对象以及名称空间和作用域
目录
函数对象
python中一切皆对象
s=10
print(s)
1.引用
s1=s
2.容器元素
lt=[s]
3.作为函数的实参
def f1(s):
print(s)
4.作为函数的返回值
def f1(s):
return s
字典/列表/元组/集合/布尔值,所有对象都可以做以上四件事
函数对象==函数名 函数名()就是在调用,没有其他意思
函数嵌套
函数里面有函数
def f1():
print('from f1')
def f2():
print('from f2')
res=f1()
函数内部定义的函数,外部就不能用
名称空间和作用域
变量名/函数名--》名称--》名称空间:专门存储名称的
内置名称空间:存储了内置方法的名称
数据类型自带内置方法;python解释器自带内置方法(print/len/list/str/dict)
全局名称空间:除了内置和局部都叫全局
局部名称空间:函数内部定义的都叫局部
名称空间的执行(生成)循序:
1.内置名称空间:python解释器启动的时候就有了
2.全局名称空间:执行文件代码的时候才会有全局
3.局部名称空间:函数调用的时候才会有局部
搜索顺序
先从当前所在位置寻找,找不到再按找这种循序,不会逆着方向寻找
局部——》全局——》内置——》报错
作用域
全局作用域:内置名称空间+全局名称空间——》全局作用域
1.全局作用域的x和局部作用域的x没有半毛钱关系
局部作用域:局部名称空间——》局部名称空间
2.局部作用域1的x和局部作用域2的x也没有任何关系,即使局部作用域1和局部作用域2在同一个局部作用域下
global
x = 10
def f1():
global x # 让global以下的局部的x变成全局的x
x = 20
f1()
print(x)
nonlocal
x = 10
def f1():
def f2():
def f3():
nonlocal x # nonlocal让x成为顶层函数的局部,不是让他成为全局 # 压根没有应用情景,尽量不要嵌套函数
x = 1
x = 2
f3()
print(1, x)
f2()
f1()
print(2,x)
def f0():
x = 3 # f1的nonlocal无法修改
f1()
所有可变数据类型均可打破上述一切规则
lt = [10]
def f1():
lt.append(12)
lt[0] = 11
f1()
print(lt)