python变量的命名空间
首先必须要提一下python程序执行过程中变量的查找规则
较官方的查找机制是:
局部作用域--外部函数作用域--全局作用域--内建函数作用域
其实一般内建函数中的作用域很少会涉及到,因为内建函数其实是一个封装好的实例函数,
它的内部变量一般在函数外部无法获取到
什么是局部作用域,外部函数作用域和全局作用域?
1. 局部作用域
指的是函数内部的作用域
例如:
def fn(a,b,c):
d=1
process
函数内的变量d位处的作用域就是函数的内部作用域,另外给fn()传入的参数a,b,c也位于函数内部的作用域内,
函数一旦调用完毕就会在内存中销毁
2. 外部函数函数作用域
例如:
def fn1():
e=1
def fn2():
pass
变量e所在的区域,外有fn1包裹,下有fn2函数,变量e所在的作用域就为外部函数作用域,外部函数作用域可以有
多个,这取决于函数有多少层嵌套
3. 全局作用域
例如:
f=1
def fn1():
e=1
def fn2():
pass
(此例在2.中例子基础上增加了变量f)
可见,变量f所在的作用域就是全局作用域,就是没有被函数包裹(即在所有函数之外)的作用域
为什么要区分局部变量和全局变量:
1. 避免变量名的冲突,因为python是一种类型较弱的语言,变量可以随时被赋值和修改为各种类型的数据,
这样容易引起命名上的冲突,局部变量和全局变量的区分使得这种冲突得到缓解
2. 为了提高效率,减少内存的占有,python规定局部变量在函数调用完之后就删除,而全局变量则不会删除
在谈及变量的命名空间这个话题必须要知道的两个语句:
global语句和nonlocal语句
global语句
一般条件下,全局作用域内定义的变量在局部变量内是无法修改的,而global语句则例外,
它在函数内部声明一个变量是全局内的变量,需要调用时去全局寻找,因此可以改变全局变量
注意:
要在函数内部声明这个变量,则在全局作用域中要事先定义(赋值)这个变量,同时在这个函数
的局部作用域内不能存在相同变量名的变量,否则程序会出错
nonlocal语句
这个语句跟global语句的功能有些类似,区别在于它是在在局部作用域内改变外部函数作用域的变量
那么在实际应用中这两个语句到底有什么用呢?
举两个简单的例子
1.
L=[] #全局变量--一个列表
while True: #此处暂且定义一个死循环,可以根据实际修改循环条件
def fn1():
global L #在函数内部给列表添加数据
L.append('abc') #abc只是一个例子,每次调用fn1()都可以增添不同数据
在循环内每次调用fn1函数都可以往列表中增添‘abc’字符串,如果L列表定义在函数内部,
则每次调用函数都会初始化列表L,就没有意义了。所以global就有这么一个作用--实现
全局变量在函数内部的修改。
2.
a=0
def fn2():
global a
a+=1
process
fn2()
fn2()
这个例子反映global语句的作用是记录函数fn2函数被调用的次数,每次调用fn2函数,a都会自增1
在函数外部可以根据变量a的值知道fn2函数被调用了多少次
nonlocal语句的用法和global语句的用法差不多,读者可以依样画葫芦,敲敲代码就知道怎么用了,
我在这里就不赘述了
python变量的命名空间的更多相关文章
- Python变量作用域(一)
在一个程序中使用变量名时,Python创建.改变或者查找变量名都是在所谓的命名空间中进行的.作用域指的就是命名空间. Python中的变量名在第一次赋值时已经创建,并且必须经过赋值后才能够使用.由于变 ...
- 九. Python基础(9)--命名空间, 作用域
九. Python基础(9)--命名空间, 作用域 1 ● !a 与 not a 注意, C/C++可以用if !a表示if a == 0, 但是Python中只能用if not a来表示同样的意义. ...
- Python 变量作用域 LEGB (上)—— Local,Global,Builtin
Python 变量作用域的规则是 LEGB LEGB含义解释:L —— Local(function):函数内的名字空间E —— Enclosing function locals:外部嵌套函数的名字 ...
- Python 变量作用域与函数
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- 13.Python中的命名空间是什么
Python中的命名空间是什么? In Python,every name introduced has a place where it lives and can be hooked for. T ...
- Python 变量类型
Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...
- Python变量、数据类型6
1.Python变量 变量,即代表某个value的名字. 变量的值存储在内存中,这意味着在创建变量时会在内存中开辟一个空间. !!!即值并没有保存在变量中,它们保存在计算机内存的深处,被变量引用.所以 ...
- Python变量类型
Python变量类型 变量是存储在内存中的值,因此在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定的内存,并决定什么数据可以被存储在内存中. 因此变量可以指定不同的数据类型, ...
- C与Python变量的区别
C中变量有类型,代表一定内存. 而Python变量只是封装过的指针,没有类型.如果不指向对象,就没有意义,更谈不上类型. python中 a=b,和C中 a=b是完全不同的两个操作.前者只是指针(引用 ...
随机推荐
- Liferay7 BPM门户开发之5: Activiti和Spring集成
参考文档: https://github.com/jbarrez/spring-boot-with-activiti-examplehttps://github.com/sxyx2008/spring ...
- 转载 Python 正则表达式入门(初级篇)
Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写.转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式 ...
- 服务器运维 -- windows系统更换System32下文件后 重启无法进入桌面
场景描述: windows系统更换System32下文件后 重启无法进入桌面 情况1,原替换文件有备份 解决建议: 准备好该文件 情况2,原备份文件没有备份 解决建议:从相同版本的服务器上边 ...
- Linux学习笔记之二————Linux系统的文件和目录
一.Windows和Linux文件系统区别 1.在 windows 平台下,打开“计算机”,我们看到的是一个个的驱动器盘符: 每个驱动器都有自己的根目录结构,这样形成了多个树并列的情形,如图所示: ...
- 21天打造分布式爬虫-Spider类爬取糗事百科(七)
7.1.糗事百科 安装 pip install pypiwin32 pip install Twisted-18.7.0-cp36-cp36m-win_amd64.whl pip install sc ...
- Android的Fragment中的互相通信-桥梁activity
Android的Fragment中的互相通信-桥梁activity 效果图如下: 项目结构图如下: Fragment1: package com.demo.fragmenttongxin; impor ...
- Docker 本地导入镜像/保存镜像/载入镜像/删除镜像
1.Docker导入本地镜像 有时候我们自己在本地或者其它小伙伴电脑上拷贝了一份镜像,有了这个镜像之后,我们可以把本地的镜像导入,使用docker import 命令. 例如这里下载了一个 aliba ...
- 利用python数据分析与挖掘相关资料总结
小生今年研二,目前主要从事软件工程数据挖掘与分析.之前一直苦于找不到一个从数据预处理.数据分析.数据可视化和软件建模的统一平台.因此,小生辗转反辙学习了java,R语言,python,scala等等. ...
- Django 学习笔记(四) --- 模型和数据库
人生苦短 ~ Tips:仅适用于 Python 3+(反正差别不大,py2 改改也能用).因为据 Python 之父 Guido van Rossum 说会在 2020 年停止对 Python 2 的 ...
- Struts2学习(一)————Struts2入门
首先推荐一本书,虽然我还没看过,但是我以后肯定会看的,<Struts+技术内幕>提取密码:kg6w .现在只是停留在会使用struts2的层次,自己也想继续深入研究,但是感觉自己的知识面还 ...