#名称空间(namespace):存放名字的地方,是对栈区的划分
#有了名称空间之后,就可以在栈区中存放相同的名字,详细的,名称空间
#1.1 内置名称空间
#存放的名字:在python解释器内置的名字
#存活周期:python解释器启动则产生,python解释器关闭则销毁
#1.2 全局名称空间
#存放的名字:不是函数内定义的,也不是内置的,剩下的都是全局名称空间
#存活周期:python文件执行则产生,python文件运行完毕后销毁
#func=函数的内存地址
# def func(): #aaa,bbb就是局部名称空间
# a=111
# b=222
# print(a,b)
# func()
#1.3 局部名称空间
#存放的名字:在调用函数时,运行函数体代码过程中产生的函数内的名字
#存活周期:在调用函数时存活,函数调用完毕后则销毁
##同一个函数调用多遍,调用一次产生一次局部名称空间
#func=函数的内存地址
# def func(): #aaa,bbb就是局部名称空间
# a=111
# b=222
# print(a,b)
# func()
#
# def func1(a,b):
# pass
#
# #同一个函数调用多遍,调用一次产生一次局部名称空间,这里长生了三个局部名称空间
# func(1,2)
# func(3,4)
# func(5,6)
#1.4 名称空间的加载顺序
# 内置名称空间----》全局名称空间----》局部名称空间
#1.5 销毁顺序
# 局部名称空间----》全局名称空间----》内置名称空间
#1.6 名称的查找优先级:从当前所在的位置向上一层一层查找
# 内置名称空间
# 全局名称空间
# 局部名称空间
# 如果当前在局部名称空间
# 内置名称空间----》全局名称空间----》局部名称空间
# input=333
# def func():
# input=444
# print(input) #当前站在局部,,print在函数内,,输出:444,注释掉input=444,输出:333
# func()
# 如果当前在全局名称空间
# 全局名称空间----》内置名称空间
# input=333
# def func():
# input=444
#
# func()
# print(input) #输出:333,当前站在全局,因为print是在全局
#示范1:
# x=111
# def func():
# print(x) #输出 111
# func()
#示范2:名称空间的‘嵌套’关系是以函数定义阶段为准,与调用位置无关
# x=1
# def func():
# print(x) #输出 1
#
# def foo():
# x=222
# func()
#
# foo()
#示范3:函数嵌套定义:
# x=333
# def f1():
# x=111
# def f2():
# x=222
# print(x) #输出 222
# f2() #调f2()
#
# def foo():
# x=444
# f1()
#
# foo()
#示范4:名字的查找关系以定义阶段为准
# x=111
# def func():
# print(x)
# x=222 #报错,定义阶段时不报错,变量要先定义后使用
#
# func()
# 二、作用域--》作用范围
# 全局作用域:内置名称空间,全局名称空间
# 1、全局存活
# 2、全局有效:被所有函数共享
# x=111
# def foo():
# print(x,id(x)) #输出:111 140716727932000
# def bar():
# print(x,id(x)) #输出:111 140716727932000
# foo()
# bar()
#局部作用域:局部名称空间
# 1、临时存活:
# 2、局部有效:函数内有效
# def foo(x):
# def f1():
# def f2():
# print(x)
#LEGB
#bulid--b
#global--g
def f1():
# e
def f2():
# enclosing--e
def f3():
# local--l
print(x)