变量的作用域指的是一个变量能够有效的区域,因为我们在使用函数的时候,有的变量是在主程序中定义的,有的是在调用的函数中定义的,当我们的主程序使用函数中定义的变量时,就会出现异常。下面来介绍一下局部变量和全局变量。
1. 局部变量
局部变量,顾名思义,就是作用在局部区域的变量,如果是在函数中定义的变量,那么就只在函数中起作用,如果在函数外部使用函数内部的变量,就会出现异常。
看下面的例子:
def test(): data = '局部变量' print('在函数内部输出data为:',data) test() print('在主程序中输出data:',data)
输出结果为:
在函数内部输出data为: 局部变量 Traceback (most recent call last): File "C:/Users/轻烟/PycharmProjects/untitled/venv/Include/ts.py", line 6, in <module> print('在主程序中输出data:',data) NameError: name 'data' is not defined
由于变量data是在函数内部定义的,我们在主程序中使用变量data则会出现访问的变量不存在的问题,所以我们要注意在函数内部定义的变量为局部变量,未作特别声明的话是不可以在函数外使用的。
2. 全局变量
全局变量我们也可以从字面意思中理解到它就是作用在全局的变量,有的同学可能自然而然的认为那么全局变量一定是定义在主程序中的变量了,其实全局变量也是可以作用在函数中的,在这里我们来介绍两种全局变量的使用方式:
1) 在主程序中定义全局变量
我们在主程序中定义的变量的作用域是全局的,我们在定义的函数中也是可以直接使用这些变量,看下面的例子:
data = '全局变量data' def test(): print('这是作用在函数中的全局变量:',data) test() print('这是作用在函数外的全局变量:',data)
输出结果:
这是作用在函数中的全局变量: 全局变量data 这是作用在函数外的全局变量: 全局变量data
这种方式就是我们通常情况下使用的全局变量,我们在主程序中定义的变量可以在函数内部直接的进行使用。
2) 使用global关键字
我们在函数内定义的变量也可以编程全局变量,这时候我们就要使用到global关键字。
首先我们先看一下当全局变量和局部变量的名字相同的时候会是一个怎么样的情况,看下面的例子:
data = '这里是全局变量data' print(data) def test(): data = '这里是局部变量data' print(data) test() print('再检查一下全局变量data:',data)
输出结果为:
这里是全局变量data 这里是局部变量data 再检查一下全局变量data: 这里是全局变量data
通过这里例子我们可以看出全局变量和局部变量的命名相同的时候是不影响全局变量的内容的,但是如果我们想要在函数中修改全局变量的值,那么我们就要使用global关键字。
再看下面的例子:
data = '这里是全局变量data' print(data) def test(): global data data = '这里是局部变量data' print(data) test() print('再检查一下全局变量data:',data)
输出结果为:
这里是全局变量data 这里是局部变量data 再检查一下全局变量data: 这里是局部变量data
通过global关键字,在局部中声明告诉这个函数global是一个全局变量,那么修改了之后,全局中的变量都做了修改,global关键字就是可以使一个变量变成全局变量。
当全局中没有声明变量的时候,我们在局部中也可以使用global关键字直接来声明一个变量是全局变量,那么我们在函数中定义的变量在主程序中也是可以使用的,看下面的例子:
def test(): global data data = '这是在局部创建的变量data' print('这是在函数中输出:',data) test() print('这是在主程序中输出:',data)
输出为:
这是在函数中输出: 这是在局部创建的变量data 这是在主程序中输出: 这是在局部创建的变量data
3. 总结
通过上面的例子我们可以了解到global关键字在控制全局变量时候的作用,另外要注意在写程序的时候尽量避免全局变量和局部变量的名字一致,尽管他们作用于不同的区域,但是会影响对代码的理解。本节就讲到这里,下一节我们来学习匿名函数。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程