简单了解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基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
利用Python破解验证码实例详解
Dec 08 Python
Django自定义认证方式用法示例
Jun 23 Python
matplotlib savefig 保存图片大小的实例
May 24 Python
浅谈python3发送post请求参数为空的情况
Dec 28 Python
Python Cookie 读取和保存方法
Dec 28 Python
pyside+pyqt实现鼠标右键菜单功能
Dec 08 Python
keras load model时出现Missing Layer错误的解决方式
Jun 11 Python
使用Nibabel库对nii格式图像的读写操作
Jul 01 Python
Django与数据库交互的实现
Jun 03 Python
Python深度学习之实现卷积神经网络
Jun 05 Python
Python实现视频中添加音频工具详解
Dec 06 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
php文件夹的创建与删除方法
2015/01/24 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
深入理解JavaScript系列(13) This? Yes,this!
2012/01/18 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
js表单提交和submit提交的区别实例分析
2015/12/10 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
2017/08/30 Javascript
javascript填充默认头像方法
2018/02/22 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
2019/06/14 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
Python3爬虫学习入门教程
2018/12/11 Python
Python3中列表list合并的四种方法
2019/04/19 Python
python处理excel绘制雷达图
2019/10/18 Python
django为Form生成的label标签添加class方式
2020/05/20 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
英国顶级珠宝品牌之家:John Greed
2018/06/09 全球购物
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
过滤器的用法
2013/10/08 面试题
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
自荐信格式
2013/12/01 职场文书
药店主任岗位责任制
2014/02/10 职场文书
《商鞅南门立木》教学反思
2014/02/16 职场文书
学生社团文化节开幕式主持词
2014/03/28 职场文书
勤奋学习演讲稿
2014/05/10 职场文书
希特勒的演讲稿
2014/05/23 职场文书
2015年度党员个人总结
2015/02/14 职场文书