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 相关文章推荐
Python入门篇之数字
Oct 20 Python
Python 字符串大小写转换的简单实例
Jan 21 Python
浅谈Series和DataFrame中的sort_index方法
Jun 07 Python
图文详解python安装Scrapy框架步骤
May 20 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
Jul 05 Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 Python
Python3使用PySynth制作音乐的方法
Sep 09 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
Jan 25 Python
浅析python表达式4+0.5值的数据类型
Feb 26 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
Apr 20 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
Jan 05 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
关于文本留言本的分页代码
2006/10/09 PHP
PHP+MySQL 制作简单的留言本
2009/11/02 PHP
php stripslashes和addslashes的区别
2014/02/03 PHP
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
Angular实现购物车计算示例代码
2017/02/21 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
js+html5生成自动排列对话框实例
2017/10/09 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
使用原生js编写一个简单的框选功能方法
2019/05/13 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
小程序接入腾讯位置服务的详细流程
2020/03/03 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
python万年历实现代码 含运行结果
2017/05/20 Python
Python多进程multiprocessing用法实例分析
2017/08/18 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
关于Django Models CharField 参数说明
2020/03/31 Python
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
奠基仪式主持词
2014/03/20 职场文书
共产党员公开承诺书
2014/03/25 职场文书
工地例会施工汇报材料
2014/08/22 职场文书
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书
Python中json.dumps()函数的使用解析
2021/05/17 Python
MySQL创建管理KEY分区
2022/04/13 MySQL