Python-名称空间

一、名称空间namespace:存放名字的地方,是对栈区的划分
有了名称空间之后,就可以在栈区中存放相同的名字,详细的名称空间分为三种
  1.内置名称空间
存放名字:存放的python解释器内置的名字
存活周期:python解释器启动则产生,python解释器关闭则销毁
  2.全局名称空间
  存放名字:只有不是函数内定义,也不是内置的,剩下的就是全局名称空间的名字
存活周期:python文件执行则产生,python文件运行完毕则销毁

'''
import os #os属于全局名称空间
x=10 #x属于全局名称空间
if 13>3:
y=20 #y属于全局名称空间
if 3==3:
z=30 #z属于全局名称空间
def func(): #func等于函数的内存地址
a=111
b=222
'''


   3.局部名称空间
存放名字:在调用函数时,运行函数体代码过程中产生的函数内的名字
存活周期:在调用函数时存活,函数调用完毕后则销毁
def func():
a=1
b=2
运行定义函数不会产生局部名称空间

func() #调用函数时才会产生局部名称空间


4.名称空间的加载顺序
内置名称空间-》全局名称空间-》局部名称空间

   5.名字的查找优先级:当前所在的位置向上一层一层查找
如果当前在局部名称空间,查找顺序是局部名称空间-》全局名称空间-》内置名称空间

'''
input=333
def func():
input=444
print(input) #当前在局部名称空间查找
func()
'''

如果当前在全局名称空间,查找顺序是全局名称空间-》内置名称空间
'''
input=333
def func():
input=444
func()
print(input) #当前在全局名称空间查找
'''

示例1
def func():
print(x) #当前在局部名称空间,局部名称空间查询x名称空间,局部名称空间没有则去全局名称空间
x=111

func()
#111

示例2:名称空间的“嵌套”关系一定是以函数定义阶段为准,与调用位置无关
x=111
def func():
print(x)#当前在局部名称空间,局部名称空间查询x名称空间,局部名称空间没有则去全局名称空间(局部名称空间查找以定于阶段为主)
def foo():
x=222
func()
foo()
#111
示例3 函数嵌套定义,名称空间查找回到定义阶段查找
x=000
def f1():
x=111
def f2():
x=222
print(x)#当前在局部名称空间,局部名称空间查询x名称空间,局部名称空间没有则去全局名称空间(局部名称空间查找以定于阶段为主)
    f2()

def foo():
f1()
foo()
#222

示例4
'''
x=111
def func():
print(x) #定义阶段确定找的x名称空间就是局部的,只检查语法有没有错误的
x=222 #局部名称空间,定义函数不会产生局部名称空间

func() #调用的时候发现x没有定义,执行会报错
#局部名称空间,调用函数时才产生局部名称空间
'''
posted @ 2020-09-25 15:21  梁博客  阅读(148)  评论(0)    收藏  举报