名称空间与作用域的基本概念~

什么是名称空间(namespaces)image

**用于存放变量名与变量值绑定关系的地方(类似于民政局)**

名称空间的分类(重要)image

**1.内置名称空间**
	python解释器提前给你定义好的 
    	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.局部名称空间**
	**函数体代码运行之后产生的都是局部名称空间**

存活周期image

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

名字的查找顺序
在查找名字的时候 要先确定自己当前在哪
image

1.如果你在局部
局部 >>> 全局 >>> 内置
2.如果你在全局
全局 >>> 内置

局部名称空间的嵌套 image

'''函数在定义阶段名字的查找顺序就已经固定死了(特例)'''
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() 		 # 输出结果是555

名称空间的作用域

image

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

内置名称空间
	程序任何阶段任何位置均可使用(全局有效)
全局名称空间
	程序任何阶段任何位置均可使用(全局有效)
局部名称空间	
	一般情况下只在各自的局部名称空间中有效

global与nonlocal关键字使用image

x = 111
def index():
    # 不可变类型的,局部修改全局变量,需要使用关键字声明
    global x
    x = 222
index()
print(x)

# 如果数据是可变类型则不用。
name_list = ['jason', 'kevin']
def index():
    name_list.append('heiheihei')
index()
print(name_list)
"""
总结:
如果想在局部修改全局数据
    如果数据为不可变类型则需要关键字global声明
    如果数据为可变类型则无需关键字global声明
"""
def index():
    # x = 111
    l1 = [11,22]
    def func():
        # 内部局部修改外部局部
        l1.append(333)
    func()
    print(l1)
index()
"""
如果想要在内部的局部修改外部局部的不可变类型数据
需要关键字nonlocal声明
"""

end

未完待续

posted @ 2021-11-16 15:21  林先生。  阅读(44)  评论(0)    收藏  举报