简单了解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实现调度算法代码详解
Dec 01 Python
100行python代码实现跳一跳辅助程序
Jan 15 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
May 26 Python
tensorflow实现逻辑回归模型
Sep 08 Python
Python 确定多项式拟合/回归的阶数实例
Dec 29 Python
python制作抖音代码舞
Apr 07 Python
Python hashlib模块实例使用详解
Dec 24 Python
Pytorch之contiguous的用法
Dec 31 Python
Python argparse模块使用方法解析
Feb 20 Python
Python GUI库PyQt5图形和特效样式QSS介绍
Feb 25 Python
Django:使用filter的pk进行多值查询操作
Jul 15 Python
python中的yield from语法快速学习
Nov 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观察者模式原理与简单实现方法示例
2017/08/25 PHP
yii2安装详细流程
2018/05/23 PHP
用javascript操作xml
2006/11/04 Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
javascript 内存回收机制理解
2011/01/17 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
JS中产生标识符方式的演变
2015/06/12 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
2018/01/12 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
JS实现的tab切换并显示相应内容模块功能示例
2019/08/03 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
Python获取文件所在目录和文件名的方法
2017/01/12 Python
python自动12306抢票软件实现代码
2018/02/24 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
如何进行有效的自我评价
2013/09/27 职场文书
计算机应用专业学生的自我评价分享
2013/11/03 职场文书
委托培训协议书
2014/11/17 职场文书
2014年妇委会工作总结
2014/12/10 职场文书
化妆品促销活动总结
2015/05/07 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
python全面解析接口返回数据
2022/02/12 Python