# 函数的命名空间和作用域
# 内置命名空间
# 存在于python解释器中,在启动python时,就自动运行内置命名空间比如print() input()即启动就可以使用的命名变量内置的名字,在启动时被加载到内存中
# 全局命名空间
# 在程序中从上至下依次被执行的名称变量,放置了我们需要的变量名称
# 局部命名空间
# 在程序中定义函数中所定义的名称变量,作用范围只是在该局部范围内有效,当函数结束时,将名称变量会释放
# 在全局空间中能够使用,内置名称和全局名称
# 在局部空间中能够使用,内置名称和全局名称和局部名称
# 在正常情况下,直接使用内置的名字
# 当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字
# 当我自己有的时候 我就不找我的上级要了
# 如果自己没有 就找上一级要 上一级没有再找上一级 如果内置的名字空间都没有 就报错
# 多个函数应该拥有多个独立的局部名字空间,不互相共享
# def f():
# a = 1
# print( a )
# print(a)
# # 在全局空间中使用,局部变量会报错
# a = []
# def f():
# a.append('ss')
# print(a)
# f()
# print(a)
# a = 1
# def f():
# a +=1
# f()
# print(a)
# 在局部变量中可以使用全局变量 但是 当全局变量为不可变类型时,不能再局部空间中对其进行运算
# 可变数据类型不受影响
# 如果想要修改,得在局部空间使用global可对全局不可变类型的变量进行改变(但是不建议使用global,因为他会使代码的安全性降低)
# a = 1
# def f1():
# a = 9
# def f2():
# b = 2
# print('##',a,b)
# def f3():
# nonlocal a
# a += 2
# print(a,'===')
# f3()
# print('&', a)
#
# f2()
# print(a,'__')
# print(a,'@@')
# f1()
# # print('a!!',a)
# def func():
# print(123)
# func1 = func
# # func1()
# # func()
# print(id(func),id(func1))
# l = [func,func1]
# for i in l:
# i()
# #函数名是内存地址,可以进行赋值,函数名可以作为容器类型的元素
def func():
print(123)
def wahaha(f):
f()
return f #函数名可以作为函数的返回值
qqxing = wahaha(func) # 函数名可以作为函数的参数
qqxing()