编程语言
首页 > 编程语言> > python:从入门到放弃 08 名称空间与作用域

python:从入门到放弃 08 名称空间与作用域

作者:互联网

目录

名称空间

名称空间即存放名字与对象映射/绑定关系的地方。对于x=3,Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中,del x表示清除该绑定关系。

在程序执行期间最多会存在三种名称空间

内建名称空间

伴随python解释器的启动/关闭而产生/回收,因而是第一个被加载的名称空间,用来存放一些内置的名字,比如内建函数名

len() print() open()

全局名称空间

伴随python文件的开始执行/执行完毕而产生/回收,是第二个被加载的名称空间,文件执行过程中产生的名字都会存放于该名称空间中

	name = 'jason'  # 变量名name存入全局名称空间
    def index():  # 函数名index存入全局名称空间
        pass
    if True:
        a = 111  # 变量名a存入全局名称空间
    for i in range(10):  # 变量名i存入全局名称空间
        pass
    while True:
        b = 222  # 变量名b存入全局名称空间

局部名称空间

伴随函数的调用/结束而临时产生/回收,函数的形参、函数内定义的名字都会被存放于该名称空间中

def index():
      name = 'jason'  # name存入局部名称空间

名称空间的生命周期

1.内置名称空间
  	python解释器运行 产生
    python解释器关闭 销毁
2.全局名称空间
  	py文件开始运行 产生
    py文件运行结束 销毁
3.局部名称空间
  	函数体代码开始运行 产生
    函数体代码运行结束 销毁

名称的加载与查找

名称空间的加载顺序是:内置名称空间->全局名称空间->局部名称空间,而查找一个名字,必须从三个名称空间之一找到,查找顺序为:局部名称空间->全局名称空间->内置名称空间。

作用域

1.全局作用域:位于全局名称空间、内建名称空间中的名字属于全局范围,该范围内的名字全局存活(除非被删除,否则在整个文件执行过程中存活)、全局有效(在任意位置都可以使用);

2.局部作用域:位于局部名称空间中的名字属于局部范围。该范围内的名字临时存活(即在函数调用时临时生成,函数调用结束后就释放)、局部有效(只能在函数内使用)。

global与nonlocal关键字

global

'''gloabl关键字:局部修改全局不可变类型'''
x=1
def foo():
    global x #声明x为全局名称空间的名字
    x=2
foo()
print(x) #结果为2
"""
如果想要在局部修改全局的不可变类型
    需要提前加关键字global申明
如果想要在局部修改全局的可变类型
    不需要加关键字global申明
"""

nonlocal

'''对于嵌套多层的函数,使用nonlocal关键字可以将名字声明为来自外部嵌套函数定义的作用域(非全局)'''
def  f1():
    x=2
    def f2():
        nonlocal x
        x=3
    f2() #调用f2(),修改f1作用域中名字x的值
    print(x) #在f1作用域查看x

f1()

#结果
3
"""
局部名称空间嵌套的情况下 内层如果想要修改外层
    情况1数据是不可变类型
        需要使用关键字nonlocal
    情况2数据是可变类型
        不需要使用关键字nonlocal
"""

标签:作用域,08,nonlocal,python,名称,空间,全局,局部
来源: https://www.cnblogs.com/RainKz/p/16023764.html