论python中的作用域
编程语言从早至今,可以分为面向过程编程、面向函数编程和面向对象编程。BASIC语言是典型的面向过程编程的语言,C语言支持面向函数编程,但不支持面向对象,JAVA只支持面向对象编程,python同时支持面向函数和面向对象编程。对于大型程序,无疑,面向对象编程更好一些。由于存在各种封装等级、封装方法,变量在不同的位置具有不同的有效区域。
一、全局变量与局部变量
那这些和全局变量、局部变量有什么关系?在面向对象编程中,所有的对象,包括变量、方法、属性等等都被封装在类或函数中,程序看起来是这样的:
PI = 3.1415926
class c1():
pass
class c2():
pass
......
def f1():
a = 10
pass
def f2():
pass
......
def main():
pass
mian()
当然,上面只是个例子,实际并非一定如此。但也能基本说明问题了。绝大多数变量都被封装在自己的函数或类里,属于局部变量,只能在自己的小天地里画圈圈。
这样做的好处是,作用域限定,互不干扰,各司其职。那些大家共同需要,共同维护的数据一般才声明为全局变量,它在所有作用域都可读。在Python里,它一般是全字母大写,并在顶头位置。我们非常不建议在包装精美的程序框架里,突然冒出个“孤魂野鬼”似的随意定义的全局变量。因此,在使用全局变量,我们通常有以下建议:
1.无论在何处对全局变量进行重新赋值,请使用global关键字
2.对于列表,字典等特殊数据类型的全局变量,可以在函数体内修改其元素,例如list.append()
3.不要在函数、类中创建全局变量。这样会让全局变量不可查,不可控。
二、python的作用域
在python中,作用域指的是某个变量的有效范围。
1. python中没有块级作用域
python中的块,指的是类似for循环、while循环、if条件语句,with语句等一个块块代码。没有块级作用域就是说在这些语句内部的变量和在外面的变量是一样的。这点与java和c#语言是有区别的。
if 1==1: #if,for 等构成一个代码块 name = 'zhang' #代码块结束 print(name)
上面的代码在python中正常执行。但在JAVA中报错,java的解释器会认为变量name没有预先定义。
2. python中的最小作用域是函数,函数管理者最小有效范围的局部变量。
这一点相信没有人会有疑问
3.python采用作用域链的机制,类似类的继承机制。
当在函数内使用一个它本身内部不存在的变量时,它会逐级向外围更大的作用域进行查找,如果最后还没找到则报错。
name = 'zhang' def func(): name='a' #print(name) def f2(): name='b' print(name) f2() func() >>> b
变量name在func和f2中都有定义,执行func()的时候,先赋值name='a',然后执行f2(),重新定义name = 'b',在执行print(name)的时候,输出的结果为‘b’
4. python内的函数在未执行之前,作用域和作用域链就已经全部确定。
name ='alex' def f1(): print(name) #f1继承自己的作用域 def f2(): name = 'eric' f1() f2() #执行f1() >>> alex
下面的例子也一样:
name = 'zhang' def f1(): print(name) def f2(): name = 'eric' #print(name) return f1 ret = f2() ret() >>> zhang
4. python是门动态语言,函数在未执行之前,只是简单的扔到内存里。
name = 'zhang' def f2(): name = 'eric' print(age) return f1 def f1(): print(name) age = 18 ret = f2() ret()
上面代码中,f1函数和age变量都出现在f2函数之后,执行程序没有任何问题。
论python中的作用域的更多相关文章
- Python中的作用域
Python中的作用域 Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的. 当 Python 遇到一个变量的话他会按照这样的顺序进行搜索: 本地作用域(Local)→当前作用域被嵌 ...
- python中的作用域与名称空间
python中的名称空间以及作用域分析 从Python解释器开始执行之后,就在内存中开辟一个空间,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征 ...
- Python中的作用域及global用法
Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的. 函数定义了本地作用域,而模块定义的是全局作用域. 如果想要在函数内定义全局作用域,需要加上global修饰符. 变量名解析:LE ...
- python中的作用域以及内置函数globals()-全局变量、locals()-局部变量
在python中,函数会创建一个自己的作用域,也称为为命名空间.这意味着在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找. 通过内置函数globals()返回的是python解释器能知道的变 ...
- python中函数作用域
在python中,一个函数就是一个作用域 name = 'xiaoyafei' def change_name(): name = 'sthu' print('在change_name里的name:' ...
- Python 中的作用域?
Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定. 当 Python 遇到一个变量的话,它会按照这的顺序进行搜索:本地作用域(Local)--->当前作用域被嵌入的本地作用域( ...
- Python中的变量作用域
python中变量作用域包括: L (Local) 局部作用域,函数内部声明但没有使用global的变量E (Enclosing) 闭包函数外的函数中,def或者lambda的本地作用域G (Glob ...
- Python中的变量和作用域详解
Python中的变量和作用域详解 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部 ...
- Python闭包及其作用域
Python闭包及其作用域 关于Python作用域的知识在python作用域有相应的笔记,这个笔记是关于Python闭包及其作用域的详细的笔记 如果在一个内部函数里,对一个外部作用域(但不是全局作用域 ...
随机推荐
- js弹出放大图
<script type="text/javascript"> function openpic(url){ OpenWindow = window.open(&quo ...
- HBase + Kerberos 配置示例(二)
接上篇<HBase + Kerberos配置示例(一)>,我们继续剩下的配置工作. 环境准备 Hadoop配置 Zookeeper配置 HBase配置 Java测试程序 环境准备 安装ha ...
- 代码生成器Kalman Studio2.2发布,完美支持Oracle,不需要安装Oracle客户端
这次更新主要是增加对Oracle的支持,不需要安装Oracle客户端,下面的配置文件列出了Kalman Studio支持的几种数据库 <?xml version="1.0" ...
- img标签中的图片加载异常时显示默认的图片
备忘:
- RabbitMQ学习笔记3-使用topic交换器
topic的路由规则里使用[.]号分隔单词,使用[*]号匹配1个单词,使用[#]匹配多个.和多个*. 在下面的例子中: logger.*可以匹配logger.error和logger.warning, ...
- C# 用代码创建 DataSet 和 DataTable 的列和记录
System.Data.DataSet objSet = new DataSet(); System.Data.DataTable objTable = new DataTable("tes ...
- 项目管理知识体系指南(PMBOOK指南)(第5版) 阅读摘要
1.7.2 项目经理的人际技能 领导力: 团队建设: 激励: 沟通: 影响力: 决策能力: 政治和文化意识: 谈判: 建立信任: 冲突管理: 教练技术: 3.4 规划过程组 在制定项目管理计划和项目文 ...
- android开发(50) Android透明状态栏。适用于 4.4 以上及 5.0以上设备
概述 有时候我们想在 andorid 手机上实现一种 跨越 顶部状态栏的效果,比如一张图片直接显示在 状态栏内.比如下图: 这个页面里有张图片,这个图片显示在整个页面的上部分.状态栏是 漂浮在这个图片 ...
- golang append
1) Append a slice b to an existing slice a: a = append(a, b...) 2) Copy a slice a to a new slice b: ...
- 在内核中异步请求设备固件firmware的测试代码
在内核中异步请求设备固件firmware的测试代码 static void ghost_load_firmware_callback(const struct firmware *fw, void * ...