名称空间与作用域

名称空间与作用域

# 什么是名称空间 
   用于存放变量名与变量值绑定关系的地方
    

名称空间的分类

1. 内置名称空间
	python解释器提前定义好的
    eg: print()
    	len()....
 2. 全局名称空间
 	在py文件中顶格编写的代码运行之后都会存入全局名称空间
        	name = 'jason'  # name全局
            def func():  # func全局
                pass
            if 1:
                a = 123  # a全局
            for i in range(10):
                print(i)  # i全局
            while True:
                a = 123  # a全局
 3. 局部名称空间
	函数体代码运行之后产生的都是局部名称空间

存活周期

1.内置名称空间
	python解释器启动与关闭创建和销毁
2.全局名称空间
	随着py文件的运行与结束而创建和销毁
3.局部名称空间
	随着函数体代码的执行与结束而创建和销毁

名字查找顺序

# 在查找名字的时候 要先确定自己当前在哪
	1.如果你在局部
    	局部 >>> 全局 >>> 内置
    2.如果你在全局
    	全局 >>> 内置
     
# 局部名称空间的嵌套 
'''函数在定义阶段名字的查找顺序就已经固定死了(特例)'''
x = 111
def f1():
    x = 222
    def f2():
        x = 333
        def f3():
            x = 444
            def f4():
                x = 555
                print(x)
                # x = 555  特例
            f4()
        f3()
    f2()
# 通过调用f1 执行所有的函数
f1()

作用域

# 作用域
		名称空间所能够作用的范围


全局作用域与局部作用域
按照名字作用范围的不同可以将三个名称空间划分为两个区域:
 1. 全局作用域:位于全局名称空间、内建名称空间中的名字属于全局范围,该范围内的名字全局存活(除非被删除,否则在整个文件执行过程中存活)、全局有效(在任意位置都可以使用)
 2.局部作用域:位于局部名称空间中的名字属于局部范围。该范围内的名字临时存活(即在函数调用时临时生成,函数调用结束后就释放)、局部有效(只能在函数内使用)
3. 内置作用域:
	程序任何阶段任何位置均可使用(全局有效)

global与nonlocal关键字使用

global 例:
# x = 111
# def index():
#     # 局部修改全局变量 需要使用关键字声明
#     global x
#     x = 222
# index()
# print(x)  # 输出结果为:222


特殊:
# name_list = ['jason', 'kevin']
# def index():
#     name_list.append('heiheihei')
# index()
# print(name_list)

'''
如果想在局部修改全局数据
	如果数据为不可变类型则需要关键字global声明
	如果数据为可变类型则不需要关键字global声明
	
'''
def  f1():
    x=2
    def f2():
        nonlocal x
        x=3
    f2()  # 调用f2(),修改f1作用域中名字x的值
    print(x)  # 在f1作用域查看x
 
f1()
 
#输出结果 :3
'''
如果想要在内部的局部修改外部局部的不可变类型数据
需要关键字nonlocal声明

'''

posted @ 2021-11-16 23:03  JasonBorn  阅读(31)  评论(0编辑  收藏  举报