论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闭包及其作用域的详细的笔记 如果在一个内部函数里,对一个外部作用域(但不是全局作用域 ...
随机推荐
- linux shell 多线程执行程序
Shell中并没有真正意义的多线程,要实现多线程可以启动多个后端进程,最大程度利用cpu性能. 直接看代码示例吧. (1) 顺序执行的代码 #!/bin/bash date ` do { echo & ...
- SSIS连接Oracle遇到的问题
Fuck!一大早上来到办公室发现 E盘被客户无缘无故干掉了,心中一万只......路过,but 接下来还是要解决问题 冷静!冷静!冷静! 问题还是要解决的 于是乎去测试开发环境 发现DW库和Repo ...
- 【LeetCode】258. Add Digits (2 solutions)
Add Digits Given a non-negative integer num, repeatedly add all its digits until the result has only ...
- XE6 FMX之控件绘制与显示
中午,有个货随手买的2块钱的彩票,尼玛中了540块,这是啥子狗屎气运.稍微吐槽一下,现在开始正规的笔记录入.经常有朋友说为毛我的博客不更新了或者说更新的少了,为啥呢!一来自己懒了,没学习什么新的东西, ...
- RabbitMQ学习笔记3-使用topic交换器
topic的路由规则里使用[.]号分隔单词,使用[*]号匹配1个单词,使用[#]匹配多个.和多个*. 在下面的例子中: logger.*可以匹配logger.error和logger.warning, ...
- ubuntu系统中的VMware 安装win7 Ghost镜像的几个坑
1.ghost镜像安装时要先分区 2.分区后要激活 3.VM(虚拟机安装win7 提示 :units specified don't exist, SHSUCDX can't install)解决方法 ...
- 仿iReader切换皮肤进度条
仿iReader切换皮肤进度条 标签(空格分隔): 自定义View [TOC] 本以为使用paint.setXfermode(new PorterDuffXfermode(Mode.XOR));可以轻 ...
- 第一篇HBuilder在这里!
本文作为一个引子,所有相关文章,都会在这里做一个索引,现在还空着.谢谢
- centos 7.0 下触发器乱码的解决
[root@iZ62jhlmmZ ~]# uname -a Linux iZ62jhlmsymZ 3.10.0-123.13.2.el7.x86_64 #1 SMP Thu Dec 18 14:09: ...
- ikvm.net简介
ikvm.net是什么 http://www.ikvm.net/ ikvm.net是能够运行在mono和.net framework的java虚拟机.它包括了 在.net中实现的一个java虚拟机 j ...