Python作用域和名称空间的详细介绍


Posted in Python onApril 13, 2022

一 名称空间

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

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

1.1 内建名称空间

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

>>> max
<built-in function max> #built-in内建

1.2 全局名称空间

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

import sys #模块名sys

x=1 #变量名x

if x == 1:
    y=2 #变量名y

def foo(x): #函数名foo
    y=1
    def bar():
        pass

Class Bar: #类名Bar
	pass

1.3 局部名称空间

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

def foo(x):
    y=3 #调用函数时,才会执行函数代码,名字x和y都存放于该函数的局部名称空间中

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

二 作用域

2.1 全局作用域与局部作用域

按照名字作用范围的不同可以将三个名称空间划分为两个区域:

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

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

2.2 作用域与名字查找的优先级

​ 在局部作用域查找名字时,起始位置是局部作用域,所以先查找局部名称空间,没有找到,再去全局作用域查找:先查找全局名称空间,没有找到,再查找内置名称空间,最后都没有找到就会抛出异常

x=100 #全局作用域的名字x
def foo():
    x=300 #局部作用域的名字x
    print(x) #在局部找x
foo()#结果为300

在全局作用域查找名字时,起始位置便是全局作用域,所以先查找全局名称空间,没有找到,再查找内置名称空间,最后都没有找到就会抛出异常

x=100
def foo():
    x=300 #在函数调用时产生局部作用域的名字x
foo()
print(x) #在全局找x,结果为100

提示:可以调用内建函数locals()和globals()来分别查看局部作用域和全局作用域的名字,查看的结果都是字典格式。在全局作用域查看到的locals()的结果等于globals()

Python支持函数的嵌套定义,在内嵌的函数内查找名字时,会优先查找自己局部作用域的名字,然后由内而外一层层查找外部嵌套函数定义的作用域,没有找到,则查找全局作用域

x=1
def outer():
    x=2
    def inner(): # 函数名inner属于outer这一层作用域的名字
        x=3
        print('inner x:%s' %x)

    inner()
    print('outer x:%s' %x)

outer() 
#结果为
inner x:3
outer x:2

在函数内,无论嵌套多少层,都可以查看到全局作用域的名字,若要在函数内修改全局名称空间中名字的值,当值为不可变类型时,则需要用到global关键字

x=1
def foo():
    global x #声明x为全局名称空间的名字
    x=2
foo()
print(x) #结果为2

当实参的值为可变类型时,函数体内对该值的修改将直接反应到原值,

num_list=[1,2,3]
def foo(nums):
    nums.append(5)

foo(num_list)
print(num_list)
#结果为
[1, 2, 3, 5]

对于嵌套多层的函数,使用nonlocal关键字可以将名字声明为来自外部嵌套函数定义的作用域(非全局)

def  f1():
    x=2
    def f2():
        nonlocal x
        x=3
    f2() #调用f2(),修改f1作用域中名字x的值
    print(x) #在f1作用域查看x

f1()

#结果
3

nonlocal x会从当前函数的外层函数开始一层层去查找名字x,若是一直到最外层函数都找不到,则会抛出异常。

到此这篇关于Python名称空间与作用域的文章就介绍到这了!

Python 相关文章推荐
python3使用tkinter实现ui界面简单实例
Jan 10 Python
Python的装饰器模式与面向切面编程详解
Jun 21 Python
Python进程间通信之共享内存详解
Oct 30 Python
详解appium+python 启动一个app步骤
Dec 20 Python
ZABBIX3.2使用python脚本实现监控报表的方法
Jul 02 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
Aug 07 Python
python 实现检验33品种数据是否是正态分布
Dec 09 Python
Python sqlite3查询操作过程解析
Feb 20 Python
Anaconda的安装及其环境变量的配置详解
Apr 22 Python
Python基于template实现字符串替换
Nov 27 Python
python对输出的奇数偶数排序实例代码
Dec 04 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
Mar 03 Python
Python获取字典中某个key的value
Apr 13 #Python
Python基本的内置数据类型及使用方法
Apr 13 #Python
Python如何使用循环结构和分支结构
Apr 13 #Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
Apr 13 #Python
python运算符之与用户交互
Apr 13 #Python
python垃圾回收机制原理分析
Apr 13 #Python
Python内置的数据类型及使用方法
Apr 13 #Python
You might like
php excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
用JAVASCRIPT如何给&amp;lt;textarea&amp;gt;&amp;lt;/textarea&amp;gt;赋值
2007/04/20 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
javascript 判断一个对象为数组的方法
2017/05/03 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
2019/09/18 Javascript
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
用Python遍历C盘dll文件的方法
2015/05/06 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
Sanic框架Cookies操作示例
2018/07/17 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
俄罗斯最大的消费电子连锁零售商:Mvideo
2017/06/25 全球购物
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
纽约海:Sea New York
2018/11/04 全球购物
计算机数据库专业职业生涯规划书
2014/02/08 职场文书
专项法律服务方案
2014/06/11 职场文书
2014村党支部书记党建工作汇报材料
2014/11/02 职场文书
《青山不老》教学反思
2016/02/22 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android