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

2022/3/18 22:27:34

本文主要是介绍python:从入门到放弃 08 名称空间与作用域,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • 名称空间
    • 内建名称空间
    • 全局名称空间
    • 局部名称空间
    • 名称空间的生命周期
    • 名称的加载与查找
  • 作用域
    • global与nonlocal关键字
      • global
      • nonlocal

名称空间

名称空间即存放名字与对象映射/绑定关系的地方。对于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
"""


这篇关于python:从入门到放弃 08 名称空间与作用域的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程