浅析Python的命名空间与作用域
作者:kangyz 发布时间:2022-11-27 04:19:04
名称空间
名称空间(namespaces):用于存放名字与内存地址绑定关系的地方,是对栈区的划分
作用:名称空间可以使栈区中存放相同的名字,从而解决命名冲突
名称空间分为三种:
内置名称空间
全局名称空间
局部名称空间
内置名称空间
内置名称空间:用于存放Python解释器中内置的名字
生命周期:Python解释器启动则产生,Python解释器关闭则销毁
例如:print、input、int ...
全局名称空间
全局名称空间:运行顶级代码所产生的名字,或者说除函数内定义以及内置的外,剩下的都是全局名称空间
生命周期:Python文件执行时产生,Python文件执行完毕后销毁
例如:
# 变量名a
a = 1
# 函数名func
def func():
pass
# 类名MyClass
class MyClass:
pass
局部名称空间
局部命名空间:在调用函数时,运行函数体代码过程中产生的函数内的名字
生命周期:函数调用时产生,函数调用完毕后销毁
例如:
def func(x, y):
pass
func(1, 2)
名称空间的先后顺序
名称空间加载顺序:内置名称空间 -> 全局名称空间 -> 局部名称空间
名称空间销毁顺序:局部名称空间 -> 全局名称空间 -> 内置名称空间
名字的查找优先级:从当前所在位置向上一层一层查找
作用域
全局作用域
全局作用域:内置名称空间、全局名称空间
特点:
全局存活
全局有效:被所有函数共享
局部作用域
局部作用域:局部名称空间
特点:
临时存活
局部有效:函数内有效
LEGB原则
找寻变量的调用顺序采用LEGB原则(即就近原则)
B —— Builtin(Python);Python内置模块的命名空间 (内建作用域)
G —— Global(module); 函数外部所在的命名空间 (全局作用域)
E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域)
L —— Local(function);当前函数内的作用域 (局部作用域)
依据就近原则,从下往上 从里向外 依次寻找
global与nonlocal
global:声明全局变量获修改全局变量
nonlocal:修改局部变量(当前函数上一层的局部变量)
# global的使用
x = 1
def func():
global x
x = 2
func()
print(x)
# nonlocal的使用
def func1():
x = 1
def func2():
nonlocal x
x = 2
func2()
print(x)
func1()
总结
名称空间是对栈的一种划分,真正存在的是栈区。名称空间只是一种虚拟的划分
名称空间只有优先级之分,并无没有嵌套关系
名称空间的“嵌套关系”决定了名字的查找顺序
名称空间的“嵌套关系”以函数定义阶段为准
来源:https://segmentfault.com/a/1190000038273514?utm_source=tuicool&utm_medium=referral


猜你喜欢
- vue代码压缩优化设置productionSourceMap为false如果不需要生产环境的 source map,可以将其设置为 fals
- 前言通常执行 python 程序要有相应的 Python 环境,但某些特定场景下,我们可能并不愿意这么麻烦的去配置这些环境(比如将写好的脚本
- 前言本文的操作环境:ubuntu,Python2.7,采用的是Pycharm进行代码编辑,个人很喜欢它的代码自动补齐功能。示例图如上图,我们
- 简介:记录一下关于 Python 环境软件包的一些安装步骤1、升级 Python 到 2.7.10( 默认 2.6.6 )shell >
- 1. 二维数据曲线图1.1 绘制二维曲线的基本函数1.plot()函数 plot函数用于绘制二维平面上的线性坐标曲线图,要提供一组x坐标和对
- MySQL5.6主从复制(读写分离)教程1、MySQL5.6开始主从复制有两种方式:基于日志(binlog);基于GTID(全局事务标示符)
- 背景和目的:利用python request 编写脚本测试公司系统的文件上传接口。前端读取文件的大小然后文件分片传给后端,后端将每一片数据重
- 本文实例讲述了thinkphp3.x自定义Action、Model及View的实现方法。分享给大家供大家参考,具体如下:1、在xmall/L
- 最近老是要为现在这个项目初始化数据,搞的很头疼,而且数据库的Id自增越来越大,要让自增重新从1开始:那么就用下面的方法吧:方法一:如果曾经的
- 基于很多原因,有不少朋友的空间不支持FSO,当大量的页面生成静态页面时,占用大量的空间,修改样式时,不方便,所以动态页面还是有动态页面的好处
- 基于微信可以做很多有意思的练手项目,看了这张速查表你就会发现,可以做的事情超过你的想象。有一次我想要统计微信群里哪些同学在北京,但发现直接问
- 本文实例讲述了mysql数据表的基本操作之表结构操作,字段操作。分享给大家供大家参考,具体如下:本节介绍:表结构操作创建数据表、查看数据表和
- mysql 8.0.28版本安装配置方法图文教程,供大家参考,具体内容如下从 Mysql 官网下载 mysql 或直接点击这里下载下载完成后
- 代码import imutilsimport cv2image = cv2.imread('') # translate t
- PyQt5 QtChart-散点图QScatterSeries类将数据以散点图显示import sysimport randomfrom P
- 发现问题最近在工作中遇到了一个问题,在定义了schema之后,每一次save都会报E11000,但是db.xxx.find()里面根本就没有
- 1、看机器配置,指三大件:cpu、内存、硬盘2、看mysql配置参数3、查系mysql行状态,可以用mysqlreport工具来查看4、查看
- 数据库对于服务端开发人员来说,几乎就是左膀右臂。几乎每一个服务端开发人员都要和数据库打交道。而MySQL又以其开源免费,小巧玲珑,简单易用,
- 有一个优秀的库可以使用————demjson示范链接http
- 这是不久前写的一个分页存储过程,可应用于SQL Server 2005上面: if object_ID('[proc_SelectF