Python函数命名空间,作用域LEGB及Global详析
发布时间:2022-09-21 15:41:31 所属栏目:PHP教程 来源:
导读: Python函数命名空间,作用域LEGB及Global详析
一、命名空间和作用域
当出现了函数,变量声明的位置就发生了变化,不同位置声明的变量,能访问这个变量的范围也出现了限制
1.1 定义**命名
一、命名空间和作用域
当出现了函数,变量声明的位置就发生了变化,不同位置声明的变量,能访问这个变量的范围也出现了限制
1.1 定义**命名
|
Python函数命名空间,作用域LEGB及Global详析 一、命名空间和作用域 当出现了函数,变量声明的位置就发生了变化,不同位置声明的变量,能访问这个变量的范围也出现了限制 1.1 定义**命名空间:**声明定义了变量,变量存在的范围,主要是通过命名空间,来区分不同范围中声明的变量。作用域: 一个数据能够作用的范围 命名空间根据范围的不同,分为以下几种类型: 1.2 内建命名空间和内建作用域 Python程序中最大的一个命名空间,通常在解释器运行目标代码的时候(也就是点RUN的时候),由解释器创建的一个命名空间,负责初始化(即第一次赋值、第一次创建)系统环境变量。如:int/type()等 1.3 全局命名空间和全局作用域 定义: 编写Python代码时,创建一个python文件,其中声明在函数外部的变量,称为:全局变量(global)。当前可以声明全局变量的所有位置称为全局命名空间 加载时间:解释器运行目标代码时,加载全局命名空间,初始化该命名空间中的所有全局变量作用:声明、定义全局变量的范围作用域:全局作用(Global)查看方式:globals()查看当前全局命名空间中的所有全局变量,本质上globals()就是一个存储了数据的字典, 例如: name = "张三" age = 12 grade = ["1",2,"3"] def outer(): a = "a" def inner(): a = "b" return inner fun = outer() fun() print(f"全局变量字典为:{globals()}") 运行结果: 1.3 局部命名空间和局部作用域 定义:当Python文件中声明函数时,独立出来了一个小的作用范围(函数内部),通常情况下我们将函数内部的空间称为:局部命名空间 加载时间:解释器运行目标代码时,加载完全局命名空间之后,加载局部命名空间,初始化局部命名空间中的局部变量 注意:如果是嵌套函数,嵌套函数是没有命名空间的,嵌套函数的空间存于父函数内,但嵌套函数是有其自己的作用域的,叫嵌套作用域(内部作用域) 作用:声明、定义局部变量作用域:局部作用域(嵌套作用域)查看方式:Locals()查看当前命名空间中的所有数据 Locals(): 查看当前命名空间中的数据 编写在函数内部:查看局部命名空间中的数据编写在函数外部:和globals()一样的意义 示例: name = "张三" age = 12 grade = ["1",2,"3"] def outer(): a = "a" print(f"outer局部的数据:{locals()}") def inner(): a = "b" print(f"inner局部的数据:{locals()}") return inner fun = outer() fun() print(f"全局变量字典为:{globals()}") print(f"全局部的数据:{locals()}") 运行结果: 1.4 总结 1.5 扩展LEGB 二、Global关键字的使用说明 在讲述什么是Global之前,让我们先来看一个例子,以下例子两条print语句分别打印什么: x = 100 def fn1(): x +=1 print(f"函数内的{x}") fn1() print(f"变更后的{x}") 运行结果: 为什么会运行报错:X在使用前需要先分配变量值,明明我们在全局已经定义了一个X=100 原因:在python动态语言内PHP命名空间,== 赋值即定义== ,在inner内部 那么怎么解决这个问题?解决的办法一:使用global关建字将x定义为全局变量,这时在函数局部就会将x指向全局的变量x 让我们来看看具体的应用,下面的代码运行结果如何: x = 100 def fn1(): x = 10 global x x +=1 print(f"函数内的{x}") fn1() print(f"变更后的{x}") 运行结果: 为什么还是报错,我们不是已经使用了global吗?那是因为我们前面声明前加了一句:x = 10 x = 10 时会将其置为局部变量,但程序执行到global x时,发现x已经在局部定义过了,所以报错,所以我们要先声明再调用 所以我们将程序调整为: 那么问题又来了,下面的例子,global x在inner函数内可以调用吗? x = 100 def outer(): global x x +=1 print(f"ouer的x调用结果{x}") def inner(): x +=1 print(f"inner的x调用结果{x}") return inner a = outer() a() 运行结果: 为什么报错,不是已经定义了global全局变量,同时也是局部作用域内先定义了吗? 原因:Global 定义只在全局和定义的当前作用域内起作用,所以上面的例子,global x只在全局作用域和嵌套作用域内可用,如果inner内部想调用,需要做以下调整 特别说明: global关键字是一种破坏函数封装的方式,变量未经过传参即可在函数内部作用域内使用。所以在日常使用中,**不要使用,那我们要实现这种调用,可以用什么方式呢?python给我提供了一个关键字:Nolocal,后续我的笔记中会详细提到 关于Python函数命名空间,作用域LEGB及Global详析的文章就介绍至此,更多相关Python LEGB与Global内容请搜索编程宝库以前的文章,希望以后支持编程宝库! 下一节:利用Python+eval函数构建数学表达式计算器Python编程技术 Python 中的函数eval()?是一个非常有用的工具,在前期,我们一起学习过该函数点击查看:Python eval 函数动态地计算数学表达式?。尽管如此,我们在使用之前,还需要考虑到该 ... (编辑:PHP编程网 - 钦州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐


浙公网安备 33038102330484号