简单了解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使用urllib模块和pyquery实现阿里巴巴排名查询
Jan 16 Python
跟老齐学Python之玩转字符串(3)
Sep 14 Python
Python中设置变量作为默认值时容易遇到的错误
Apr 03 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
在Django admin中编辑ManyToManyField的实现方法
Aug 09 Python
Python实现二叉树的最小深度的两种方法
Sep 30 Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
Oct 27 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
如何用OpenCV -python3实现视频物体追踪
Dec 04 Python
Python3 实现爬取网站下所有URL方式
Jan 16 Python
keras训练浅层卷积网络并保存和加载模型实例
Jul 02 Python
手把手教你怎么用Python实现zip文件密码的破解
May 27 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,ASP.JAVA,JAVA代码格式化工具整理
2010/06/15 PHP
PHP 第一节 php简介
2012/04/28 PHP
prototype1.4中文手册
2006/09/22 Javascript
jQuery select的操作实现代码
2009/05/06 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
2015/06/19 Javascript
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
2017/06/25 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
基于python if 判断选择结构的实例详解
2019/05/06 Python
python调用摄像头拍摄数据集
2019/06/01 Python
Django组件content-type使用方法详解
2019/07/19 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
2020/02/28 Python
Selenium使用Chrome模拟手机浏览器方法解析
2020/04/10 Python
keras导入weights方式
2020/06/12 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
关于HTML5的22个初级技巧(图文教程)
2012/06/21 HTML / CSS
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
生产部统计员岗位职责
2014/01/05 职场文书
幼师自我鉴定
2014/02/01 职场文书
借款协议书
2014/04/12 职场文书
阳光体育活动总结
2014/04/30 职场文书
毕业生自荐材料范文
2014/12/30 职场文书
中层干部考核评语
2015/01/04 职场文书
绵山导游词
2015/02/05 职场文书
校友会致辞
2015/07/30 职场文书