简单了解Python变量作用域正确使用方法


Posted in Python onJune 12, 2020

在写代码的时候,免不了要使用变量。但程序中的一个变量并不一定是在哪里都可以被使用,根据情况不同,会有不同的“有效范围”。

看这样一段代码:

def func(x):
  print ('X in the beginning of func(x): ', x)
  x = 2
  print ('X in the end of func(x): ', x)
x = 50func(x)print ('X after calling func(x): ', x)

输出:

X in the beginning of func(x): 50
X in the end of func(x): 2
X after calling func(x): 50

变量 x 在函数内部被重新赋值。但在调用了函数之后,x 的值仍然是50。为什么?

这就得说一下变量的“作用域”:

当函数内部定义了一个变量,无论是作为函数的形参,或是另外定义的变量,它都只在这个函数的内部起作用。函数外即使有和它名称相,另外注意:光理论是不够的。这里顺便送大家一套2020最新python入门到高级项目实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,还可以跟老司机交流讨教!

同的变量,也没有什么关联。这个函数体就是这个变量的作用域。像这样在函数内部定义的变量被称为“局部变量”。

要注意的是,作用域是从变量被定义的位置开始。像这样的写法是有问题的:

def func():
  print (y)
  y = 2
  print (y)

报错:

UnboundLocalError: local variable 'y' referenced before assignment

因为在 y = 2 之前,y 并不存在,调用 y 的值就会出错。

回到开始那个例子:

在函数 func 外部,定义的变量 x,赋值为 50,作为参数传给了函数 func。而在函数 func 内部,变量 x 是形参,它的作用域是整个函数体内部。它与外面的那个 x 没有关系。只不过它的初始值是由外面那个 x 传递过来的。

所以,虽然函数体内部的 x 被重新赋值为 2,也不会影响外面那个 x 的值。

不过有时候,我们希望能够在函数内部去改变一些变量的值,并且这些变量在函数外部同样被使用到。怎么办?

一种方法是,用 return 把改变后的变量值作为函数返回值传递出来,赋值给对应的变量。比如开始的那个例子,可以在函数结尾加上

return x

然后把调用改为

x = func(x)

还有一种方法,就是使用“全局变量”。

在 Python 的函数定义中,可以给变量名前加上 global 关键字,这样其作用域就不再局限在函数块中,而是全局的作用域。

通过 global 改写开始的例子:

def func():
  global x  print ('X in the beginning of func(x): ', x)
  x = 2
  print ('X in the end of func(x): ', x)
x = 50func()print ('X after calling func(x): ', x)

输出:

X in the beginning of func(x): 50
X in the end of func(x): 2
X after calling func(x): 2

函数 func 不再提供参数调用。而是通过 global x 告诉程序:这个 x 是一个全局变量。于是函数中的 x 和外部的 x 就成为了同一个变

量。这一次,当 x 在函数 func 内部被重新赋值后,外部的 x 也随之改变。

前面讲的局部变量和全局变量是 Python 中函数作用域最基本的情况。实际上,还有一些略复杂的情况,比如:

def func():
  print ('X in the beginning of func(x): ', x)  # x = 2
  print ('X in the end of func(x): ', x)
x = 50func()print ('X after calling func(x): ', x)

输出:

X in the beginning of func(x): 50
X in the end of func(x): 50
X after calling func(x): 50

程序可以正常运行。虽然没有指明 global,函数内部还是使用到了外部定义的变量。然而一旦加上

x = 2

这句,程序就会报错。因为这时候,x 成为一个局部变量,它的作用域从定义处开始,到函数体末尾结束。

建议在写代码的过程中,显式地通过 global 来使用全局变量,避免在函数中直接使用外部变量。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python程序中实现分布式进程的教程
Apr 28 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
Python中的pygal安装和绘制直方图代码分享
Dec 08 Python
Python实现确认字符串是否包含指定字符串的实例
May 02 Python
python 获取当天凌晨零点的时间戳方法
May 22 Python
python开启摄像头以及深度学习实现目标检测方法
Aug 03 Python
用Python实现筛选文件脚本的方法
Oct 27 Python
10分钟教你用Python实现微信自动回复功能
Nov 28 Python
Python脚本按照当前日期创建多级目录
Mar 01 Python
python3.6下Numpy库下载与安装图文教程
Apr 02 Python
Python更新所有已安装包的操作
Feb 13 Python
Python可视化神器pyecharts绘制地理图表
Jul 07 Python
keras 读取多标签图像数据方式
Jun 12 #Python
Python数据可视化图实现过程详解
Jun 12 #Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 #Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
Jun 12 #Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
Jun 12 #Python
python + selenium 刷B站播放量的实例代码
Jun 12 #Python
解决Keras自带数据集与预训练model下载太慢问题
Jun 12 #Python
You might like
无线电波是什么?它是怎样传输的?
2021/03/01 无线电
php 读取文件头判断文件类型的实现代码
2013/08/05 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
2015/10/10 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
JavaScript中的集合及效率
2010/01/08 Javascript
js实现addClass,removeClass,hasClass的函数代码
2011/07/13 Javascript
js 实现 input type="file" 文件上传示例代码
2013/08/07 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
jQuery中click事件用法实例
2014/12/26 Javascript
js异步上传多张图片插件的使用方法
2018/10/22 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
python判断字符串是否包含子字符串的方法
2015/03/24 Python
python基于ID3思想的决策树
2018/01/03 Python
Python基于socket实现简单的即时通讯功能示例
2018/01/16 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
OnePlus加拿大官网:中国国际化手机品牌
2020/10/13 全球购物
卫生安全检查制度
2014/02/04 职场文书
师德师风建设方案
2014/05/08 职场文书
毕业证委托书范文
2014/09/26 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
护士求职自荐信范文
2015/03/04 职场文书
2015年度绩效考核工作总结
2015/05/27 职场文书
幼儿园六一主持词
2015/06/30 职场文书
军训通讯稿范文
2015/07/18 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python