day15_名称空间与作用域



#名称空间(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)



























posted @ 2020-12-31 15:43  欢乐二次方  阅读(102)  评论(0)    收藏  举报