Python 基础(十八):命名空间 & 作用域
时间:2022-07-23
本文章向大家介绍Python 基础(十八):命名空间 & 作用域,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 命名空间
1.1 概念
命名空间(namespace)是名称到对象的映射,当前大部分命名空间都是通过 Python 字典来实现的,它的主要作用是避免项目中的名字冲突,每一个命名空间都是相对独立的,在不同的命名空间中可以同名,在相同的命名空间中不可以同名。
1.2 种类
命名空间主要有以下三种:
- 内置:主要用来存放内置函数、异常等,比如:abs 函数、BaseException 异常。
- 全局:指在模块中定义的名称,比如:类、函数等。
- 局部:指在函数中定义的名称,比如:函数的参数、在函数中定义的变量等。
1.3 生命周期
通常在不同时刻创建的命名空间拥有不同的生命周期,看一下三种命名空间的生命周期:
- 内置:在 Python 解释器启动时创建,退出时销毁。
- 全局:在模块定义被读入时创建,在 Python 解释器退出时销毁。
- 局部:对于类,在 Python 解释器读到类定义时创建,类定义结束后销毁;对于函数,在函数被调用时创建,函数执行完成或出现未捕获的异常时销毁。
2 作用域
2.1 概念
作用域是 Python 程序可以直接访问命名空间的文本区域(代码区域),名称的非限定引用会尝试在命名空间中查找名称,作用域是静态的,命名空间是随着解释器的执行动态产生的,因此在作用域中访问命名空间中的名字具有了动态性,即作用域被静态确定,被动态使用。
2.2 种类
Python 有如下四种作用域:
- 局部:最先被搜索的最内部作用域,包含局部名称。
- 嵌套:根据嵌套层次由内向外搜索,包含非全局、非局部名称。
- 全局:倒数第二个被搜索,包含当前模块的全局名称。
- 内建:最后被搜索,包含内置名称的命名空间。
作用域的搜索顺序通过下图直观的来看一下:
Python 中会按上图所示作用域由内向外去搜索名字。
再通过具体代码来对作用域作进一步了解,如下所示:
# 全局作用域
g = 1
def outer():
# 嵌套作用域
e = 2
def inner():
# 局部作用域
i = 3
2.3 global & nonlocal
我们先来看一下全局变量与局部变量。
- 全局变量:定义在函数外部的变量。
- 局部变量:定义在函数内部的变量。
全局变量可以在整个程序范围内进行访问,而局部变量只能在函数内部访问。通过具体示例看一下:
# 全局变量
d = 0
def sub(a, b):
# d 在这为局部变量
d = a - b
print('函数内 : ', d)
sub(9, 1)
print('函数外 : ', d)
执行结果:
函数内 : 8
函数外 : 0
当内部作用域想要修改外部作用域的变量时,就要用到 global
和 nonlocal
关键字了,下面通过具体示例来了解一下。
如果我们想将上面示例中 sub()
函数中的 d
变量修改为全局变量,则需使用 global
关键字,示例如下所示:
# 全局变量
d = 0
def sub(a, b):
# 使用 global 声明 d 为全局变量
global d
d = a - b
print('函数内 : ', d)
sub(9, 1)
print('函数外 : ', d)
执行结果:
函数内 : 8
函数外 : 8
如果需要修改嵌套作用域中的变量,则需用到 nonlocal
关键字。
不使用 nonlocal
我们先来看一下不使用 nonlocal
关键字的执行情况,如下所示:
def outer():
d = 1
def inner():
d = 2
print('inner:', d)
inner()
print('outer:', d)
outer()
执行结果:
inner:2
outer:1
使用 nonlocal
再来看一下使用了 nonlocal
关键字的执行情况,如下所示:
def outer():
d = 1
def inner():
nonlocal d
d = 2
print('inner:', d)
inner()
print('outer:', d)
outer()
执行结果:
inner:2
outer:2
- Golang中container/list包中的坑
- 关于Golang语言数组索引的有趣现象
- 使用SQL来分析数据库参数(二)(r10笔记第82天)
- Golang不定参数
- [go语言]利用缓冲信道来实现网游帐号验证消息的分发和等待
- 转--Golang语言版 ssh口令破解工具
- cubieboard(树莓派)安装Ubuntu+Apache+PHP+Mysql
- Oracle 12c里的几点补充(一)(r11笔记第7天)
- Oracle备库的PDB无法连接的问题(r11笔记第6天)
- Golang语言社区--模板的使用
- Golang语言写Web 应用程序
- 强制wordpress后台HTTPS
- Golang语言 Cookie的使用
- Golang 语言调用动态库实现OpenGL及windows的API编程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C# dotnet 使用判断文件夹存在的方法判断一个文件路径会怎样
- 怎样给wordpress网站模板,添加最新文章、随机文章、热评文章?
- [医疗信息化][DICOM教程]1.使用Java的DICOM基础-理解DICOM文件-DICOM Basics using Java - Making Sense of the DICOM File
- python自动播放网课
- Istio实战——流量管理
- WordPress移除head头部js、css、feed等多余加载项
- python控制鼠标键盘,解放你的双手~
- 用腾讯云批量计算(batch-compute)调度GPU分布式机器学习
- R语言模拟保险模型中分类器的ROC曲线不良表现
- Linux xargs grep zgrep命令
- r语言空间可视化绘制道路交通安全事故地图
- 小知识:Oracle RAC添加服务名实现单节点访问
- Python去掉图片四周纯色边框
- R语言空间可视化:绘制英国脱欧投票地图
- CC攻击防御的一种方法