简单了解Python变量作用域正确使用方法
作者:程序员的人生A 发布时间:2022-02-03 04:18:55
在写代码的时候,免不了要使用变量。但程序中的一个变量并不一定是在哪里都可以被使用,根据情况不同,会有不同的“有效范围”。
看这样一段代码:
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 来使用全局变量,避免在函数中直接使用外部变量。
来源:https://www.cnblogs.com/chengxuyuanaa/p/12964340.html
猜你喜欢
- Python容器使用的5个技巧和2个误区“容器”这两个字很少被 Python 技术文章提起。一看到“容器”,大家想到的多是那头蓝色小鲸鱼:D
- 前言说说外星人那些事儿....你以为的外星人......他们都是乘坐UFO来地球的,长的嗯哼可能比较有特色。也许长这样害!其实可能也或许不长
- 其实我们平时在深度学习中所说的卷积操作,在 opencv 中也可以进行,或者说是类似操作。那么它是什么操作呢?它就是图像的模糊(滤波)处理。
- 通常情况下我们在更新数据时需要先从数据库里将原数据取出后放在内存里,然后编辑某些字段或属性,最后提交更新数据库。使用F方法则可以帮助我们避免
- 本文通过一个csv实例文件来展示如何删除Pandas.DataFrame的行和列数据文件名为:example.csv内容为:datespri
- 前言:如何做到,控制多设备并行执行测试用例呢。思路篇我们去想下,我们可以获取参数的信息,和设备的信息,那么我们也可以针对每台设备开启不一样的
- type()方法返回传递变量的类型。如果传递变量是字典那么它将返回一个字典类型。语法以下是type()方法的语法:type(di
- 引言最近遭遇了绑定手机号相关的压测需求,有了手机号登录的经验和测试数据,这次算起来比较简单。最重要的是难点就是要求开发配合调整配置已经在上一
- Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则。
- 最近学了一点点python爬虫的知识,面向百度编程爬了一本小说之后感觉有点不满足,于是突发奇想尝试爬一本漫画下来看看。一、效果展示首先是我们
- (5)SELECT (5-2) DISTINCT(5-3)TOP(<top_specification>)(5-1) <s
- 开放源代码社区为了扩展MySQL的使用范围,开发出了.Net框架(.NET Framework)中可以使用的数据库连接器。我们就来学习一下如
- 代码如下:'文字水印 Function WordWatermark(ImagePath) Dim&nb
- 数字列表和其他列表类似,但是有一些函数可以使数字列表的操作更高效。我们创建一个包含10个数字的列表,看看能做哪些工作吧。# Print ou
- tensorflow模型保存为saver = tf.train.Saver()函数,saver.save()保存模型,代码如下:import
- 项目地址:https://github.com/ray-project/ray1、简介Ray为构建分布式应用程序提供了一个简单、通用的API
- wx包中的方法都是以大写字母开头的,而这和Python的习惯是相反的。本节介绍如何创建python程序的图形用户界面(GUI),也就是那些带
- 好久没写了,就把上课做的一个小东西拿出来分享一下吧。百度网页截图如下 ↓↓↓程序运行输出结果截图 ↓↓↓上代码 ↓↓↓from lxml i
- 今天给大家介绍一个十分好用的Python模块,用来给数据集做一个初步的探索性数据分析(EDA),有着类似Tableau的可视化界面,我们通过
- PHP添加图像处理(ImageMagick)下载地址:http://pecl.php.net/package/imagick安装说明:htt