-
名称空间
-
名字的查询
-
作用域
-
global与nonlocal关键字
-
函数名对象
-
函数的嵌套
名称空间
名称空间:存放变量名和变量值绑定的地方
名称空间的分类:
1.内置名称空间
python解释器提前给我们定义好的
len() print() open()
2.全局名称空间
在py文件中编写的代码运行产生的名字都会存到全局名称空间
age = 18 # 变量名age进入全局名称空间
def func(): # 函数名func存入全局名称空间
pass
3.局部名称空间
函数体代码运行产生的都是局部名称空间
def index():
age = 18 # age进入局部名称空间
存活周期
1.内置名称空间
python解释器运行 产生
python解释器关闭 销毁
2.全局名称空间
py文件开始运行 产生
py文件结束运行 销毁
3局部名称空间
函数体代码开始运行 产生
函数体代码结束运行 销毁
名字的顺序查找
在查找名字的时候 一定要搞清楚自己在哪个空间
1.如果在局部名称空间
查找顺序为:局部名称空间>>>全局名称空间>>>内置名称空间
2.如果在全局名称空间
查找顺序为:全局名称空间>>>内置名称空间
作用域
作用域就是名称空间能够作用的范围
内置名称空间
程序任意阶段位置均可使用(全局有效)
全局名称空间
程序任意阶段位置均可使用(全局有效)
局部名称空间
一般情况下只在各自局部名称中使用(局部有效)
global与nonlocal关键字
global:局部修改全局不可变类型
不可变:
a = '全局'
def index():
x = '局部' ## 并不是在修改全局的x 而是在局部空间创建了一个新的x
#如果想要在局部名称空间中修改全局名称空间中的名字 属于不可变类型 那么需要关键字申明 不可变类型不需要加关键字
global x # 申明 修改的是全局x而不是产生新的x
x = 555
index()
print(x)
可变:
l1 = [111,222,333]
def index():
l1.append[444]
index()
print(l1)
nonlocal:对于嵌套函数,内层如果想要修改外层不可变数据类型则需要此关键字,不可变数据类型不需要
函数多种用法
用法1:函数名可以当作变量名赋值
def index():
print('from function index')
print(index)
res = index #让res也指向函数体代码
print(res)
res() # index()
用法2:函数名还可以当成函数的实参
def index():
print('from index')
def func(a):
print('from func')
print(a)
a()
func(index)
用法3:函数名还可以当作函数的返回值
def index():
print('from index')
return index # 将函数名当作返回值
def func():
print('from func')
res = index() # 接收函数名
print(res) #指向func函数的内存地址
res() # func()
用法4:函数名可以作为容器类型的元素
def index():
print('from index')
l1 = [11,22,33,44,index]
print(l1)
l1[-1]() # index()
函数的嵌套
def my_max
'''返回两个数最大的值'''
if a > b:
return a
return b
def many_max(a,b,c,d)
res = my_max(a,b)
res1 = my_max(res,c)
res2 = my_max(res1,d)
many_max(33,55,22,77) # 返回77