简单了解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实现的简单RPG游戏流程实例
Jun 28 Python
python机器人行走步数问题的解决
Jan 29 Python
django框架model orM使用字典作为参数,保存数据的方法分析
Jun 24 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
基于Python解密仿射密码
Oct 21 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
Dec 13 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
pytorch 自定义卷积核进行卷积操作方式
Dec 30 Python
pytorch模型存储的2种实现方法
Feb 14 Python
python 实现单例模式的5种方法
Sep 23 Python
Python入门基础之数字字符串与列表
Feb 01 Python
python和Appium的移动端多设备自动化测试框架
Apr 26 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
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
Jquery中国地图热点效果-鼠标经过弹出提示层信息的简单实例
2014/02/12 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
node.js利用mongoose获取mongodb数据的格式化问题详解
2017/10/06 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
vue绑定class的三种方法
2020/12/24 Vue.js
python基础教程之获取本机ip数据包示例
2014/02/10 Python
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
Python中强大的命令行库click入门教程
2016/12/26 Python
Python利用operator模块实现对象的多级排序详解
2017/05/09 Python
python中如何使用正则表达式的集合字符示例
2017/10/09 Python
python 实现登录网页的操作方法
2018/05/11 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
解决pycharm下pyuic工具使用的问题
2020/04/08 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
助人为乐好少年事迹材料
2014/08/18 职场文书
医德考评自我评价
2014/09/14 职场文书
肖申克救赎观后感
2015/06/02 职场文书
先进个人事迹材料(2016推荐版)
2016/03/01 职场文书
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python
SpringBoot生成License的实现示例
2021/06/16 Java/Android