17.3.20---python的变量作用域
1---变量的作用域
在Python程序中创建、改变、查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域。Python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定。
2---高级语言对数据类型的使用过程
一般的高级语言在使用变量时,都会有下面4个过程。当然在不同的语言中也会有着区别。
1. 声明变量:让编辑器知道有这一个变量的存在
2. 定义变量:为不同数据类型的变量分配内存空间
3. 初始化:赋值,填充分配好的内存空间
4. 引用:通过引用对象(变量名)来调用内存对象(内存数据)
3---作用域的产生
就作用域而言,Python与C有着很大的区别,在Python中并不是所有的语句块中都会产生作用域。只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候,才会有作用域的概念。
注意:在if-elif-else、for-else、while、try-except\try-finally等关键字的语句块中并不会产成作用域
4---作用域的类型
1)局部作用域L(local)
包含在def关键字定义的语句块中,即在函数中定义的变量
每当函数被调用时都会创建一个新的局部作用域。
Python中也有递归,即自己调用自己,每次调用都会创建一个新的局部命名空间
在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量
有些情况需要在函数内部定义全局变量,这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个 栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态。所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间
2)E(enclosing)嵌套作用域
E也包含在def关键字中,E和L是相对的,E相对于更上层的函数而言也是L。与L的区别在于,对一个函数而言,L是定义在此函数内部的局部作用域,而E是定义在此函数的上一层父级函数的局部作用域。主要是为了实现Python的闭包,而增加的实现。
3)G(global)全局作用域
即在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明的变量具有全局作用域,从外部开来,模块的全局变量就是一个模块对象的属性。
注意:全局作用域的作用范围仅限于单个模块文件内
4)B(built-in)内置作用域
系统内固定模块里定义的变量,如预定义在__builtin__ 模块内的变量。
5)变量名解析LEGB法则
搜索变量名的优先级:局部作用域 > 嵌套作用域 > 全局作用域 > 内置作用域
#!/usr/bin/env python
#conding:utf8 globalVar = #G def test_scope():
enclosingVar = #E
def func():
localVar = #L
print __name__ #B
5---变量的修改
1)nonlocal关键字
在L中修改E中的变量。这是Python3.x增加的新特性,在python2.x中还是无法使用。
6---详情还可见:
http://lib.csdn.net/article/python/60712#%E7%9B%AE%E5%BD%95
最新文章
- Java名字的由来
- iframe高度自适应(同域)
- 开发常用之在webstorm中使用cmd
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
- uC/OS-II中includes块
- coreos安装
- COM/ATL 资料收集
- Netty源代码学习——ChannelPipeline模型分析
- 生活沉思录 via 哲理小故事(四)
- jQuery给input绑定回车事件
- Python2和Python3安装教程
- CSS特例定位方式
- 使用PHP实现RSA算法的加密和解密
- WinForm DataGridView 绑定泛型List(List<;T>;)/ArrayList不显示的原因和解决
- linux远程目录共享
- 如何在Mac上搭建自己的服务器——Nginx
- superset链接本地mysql数据库
- [日常工作] Linux与Windows的连接访问以及数据共享等方法 vncserver smb xshell xftp winscp mount等
- CodeForces911D 逆序对
- shell 截取字符串