Python 专题六 局部变量、全局变量global、导入模块变量


Posted in Python onMarch 20, 2017

定义在函数内的变量有局部作用域,在一个模块中最高级别的变量有全局作用域。本文主要讲述全局变量、局部变量和导入模块变量的方法。

参考:《Python核心编程 (第二版)》

一. 局部变量

声明适用的程序的范围被称为了声明的作用域。在一个过程中,如果名字在过程的声明之内,它的出现即为过程的局部变量;否则出现即为非局部。例:

def foo(x): 
 print 'x = ',x 
 x = 200 
 print 'Changed in foo(), x = ',x 
x = 100 
foo(x) 
print 'x = ',x

输出结果如下:

>>> 
x = 100 
Changed in foo(), x = 200 
x = 100

在主块中定义x=100,Python使用函数声明的形参传递x至foo()函数。foo()中把x赋值为200,x是函数的局部变量;所以在函数内改变x的值,主块中定义的x不受影响。

核心笔记:

当搜索一个标识符时,Python先从局部作用域开始搜索。如果在局部作用域内没有找到那个名字,那么一定会在全局域找到这个变量,否则会被抛出NameError异常。

作用域的概念和用于找到变量的名称空间搜索顺序相关。当一个函数执行时,所有在局部命名空间的名字都在局部作用域内;当查找一个变量时,第一个被搜索的名称空间,如果没有找到那个变量,那么就可能找到同名的局部变量。

二. 全局变量

全局变量的一个特征是除非删除掉,否则它们存活到脚本运行结束,且对于所有的函数,它们的值都是可以被访问的。然而局部变量,就像它们存放的栈,暂时地存在,仅仅只依赖于定义它们的函数现阶段是否处于活动。当一个函数调用出现时,其局部变量就进入声明它们的作用域。在那一刻,一个新的局部变量名为那个对象创建了,一旦函数完成,框架被释放,变量将会离开作用域。

X = 100 
def foo(): 
 global X 
 print 'foo() x = ',X 
 X = X + 5 
 print 'Changed in foo(), x = ',X 
def fun(): 
 global X 
 print 'fun() x = ',X 
 X = X + 1 
 print 'Changed in fun(), x = ',X 
if __name__ == '__main__': 
 foo() 
 fun() 
 print 'Result x = ',X

输出结果如下:

>>> 
foo() x = 100 
Changed in foo(), x = 105 
fun() x = 105 
Changed in fun(), x = 106 
Result x = 106

核心笔记:

使用global语句定义全局变量。当使用全局变量同名的局部变量时要小心,如果将全局变量的名字声明在一个函数体内,全局变量的名字能被局部变量给覆盖掉。所以,你应该尽量添加global语句,否则会使得程序的读者不清楚这个变量在哪里定义的。

你可以使用同一个global语句指定多个全局变量。例如global x, y, z。

当我在制作Python爬虫时,需要想函数中传递url,循环爬取每个url页面的InfoBox,此时的文件写入操作就可以有两种方法实现:1.通过传递参数file;2.通过定义全局变量file。

SOURCE = open("F:\\test.txt",'w') 
def writeInfo(i): 
 global SOURCE 
 SOURCE.write('number'+str(i)+'\n') 
def main(): 
 i=0 
 while i<50: 
 writeInfo(i) 
 print i 
 i=i+1 
 else: 
 print 'End' 
 SOURCE.close() 
main()

PS:在此种用法中,如果我们在函数writeInfo()中不使用global 声明全局变量SOURCE,其实也可以使用,但是此时应该是作为一个内部变量使用,由于没有初始值,因此报错。Python查找变量是顺序是:先局部变量,再全局变量。

UnboundLocalError: local variable 'SOURCE' referenced before assignment 

三. 模块导入变量

主要方法是通过在py文件中模块定义好变量,然后通过import导入全局变量并使用。例:

import global_abc 
def foo(): 
 print global_abc.GLOBAL_A 
 print global_abc.GLOBAL_B 
 print global_abc.GLOBAL_C 
 global_abc.GLOBAL_C = global_abc.GLOBAL_C + 200 
 print global_abc.GLOBAL_C 
 
if __name__ == '__main__': 
 foo() 
 print global_abc.GLOBAL_A + ' ' + global_abc.GLOBAL_B 
 print global_abc.GLOBAL_C 
 输出如下所示,全局变量结构是可以改变的。
>>> 
hello 
world 
300 
500 
hello world 
500

截图如下所示:

Python 专题六 局部变量、全局变量global、导入模块变量

PS:应该尽量避免使用全局变量。不同的模块都可以自由的访问全局变量,可能会导致全局变量的不可预知性。对全局变量,如果程序员甲修改了_a的值,程序员乙同时也要使用_a,这时可能导致程序中的错误。这种错误是很难发现和更正的。同时,全局变量降低了函数或模块之间的通用性,不同的函数或模块都要依赖于全局变量。同样,全局变量降低了代码的可读性,阅读者可能并不知道调用的某个变量是全局变量,但某些情况不可避免的需要使用它。

最后关于闭包和Lambda(相当于函数)就不再介绍。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Python 相关文章推荐
python访问sqlserver示例
Feb 10 Python
python操作摄像头截图实现远程监控的例子
Mar 25 Python
python登录pop3邮件服务器接收邮件的方法
Apr 30 Python
TensorFlow实现卷积神经网络CNN
Mar 09 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
python实现连续图文识别
Dec 18 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
Feb 21 Python
Django自定义用户登录认证示例代码
Jun 30 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
Aug 20 Python
导入tensorflow时报错:cannot import name 'abs'的解决
Oct 10 Python
python 已知三条边求三角形的角度案例
Apr 12 Python
python实现的人脸识别打卡系统
May 08 Python
python list排序的两种方法及实例讲解
Mar 20 #Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
Mar 20 #Python
Python 专题四 文件基础知识
Mar 20 #Python
python 与GO中操作slice,list的方式实例代码
Mar 20 #Python
Python闭包的两个注意事项(推荐)
Mar 20 #Python
使用python实现生成用户信息
Mar 20 #Python
Unicode和Python的中文处理
Mar 19 #Python
You might like
人族 TERRAN 概述
2020/03/14 星际争霸
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
PHP中foreach()用法汇总
2015/07/02 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
PHP最常用的正则表达式
2017/02/13 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
2017/04/05 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
2019/03/30 PHP
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
Vue Socket.io源码解读
2018/02/07 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
python从入门到精通(DAY 3)
2015/12/20 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
Python 备份程序代码实现
2017/03/06 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
python基础梳理(一)(推荐)
2019/04/06 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
Derek Rose官网:英国高档睡衣、家居服和内衣品牌
2020/01/18 全球购物
毕业自我评价范文
2013/11/17 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
团组织推优材料
2014/12/29 职场文书
Python数据分析之绘图和可视化详解
2021/06/02 Python