---------------------------------------------------------------------------------------------------------------------------------
在本文章中,我们来讨论一下python中的全局变量,我们将学习如何定义全局变量,然后如何在函数中访问它们,以及如何在函数中修改全局变量的值。
全局变量:
python的代码结构一般按照shebang、import模块、全局变量、函数定义、执行代码的顺序进行编写,可以看出全局变量的定义处于比较靠前的位置,这样就避免了因为全局变量定义靠后,但python解释器逐行解释,以至于前面的代码无法识别局部变量的问题。
全局变量的作用域:
全局变量定义在函数的外部,在函数内部定义的变量称为局部变量,python程序中的所有部分都可以访问全局变量,局部变量只能在本函数内可用,并且在函数中,变量的使用顺序是:局部变量 > 全局变量,也就是说,如果局部变量和全局变量都用a表示,那么调用a时,函数会优先调用局部变量。
全局变量实例:
我们按照文章开头讲解的代码结构顺序,展示一个简单的全局变量的实例
输出:
变量"gl_result"是在函数外部定义的,因此,他是一个全局变量。
在函数内部对全局变量赋值
如果我们在函数内部对全局变量进行赋值操作,那么全局变量的值会改变吗?
输出:
可以看出,函数内部的gl_result的值已经被我们修改成100了,但是函数外部的变量值仍为1,说明通过调用函数,我们没能修改到全局变量的值,只能修改函数内部的值,这又是为什么呢?
因为,如果在函数内部定义了一个与全局变量相同名称的变量,那么函数就会认为这是在创建一个与全局变量名称相同的变量,所以我们实际修改到的值只是函数中的局部变量的值,并非我们想要修改的全局变量。我们通过pycharm的提示也可以看到
有一个shadows name在函数外部,在PyCharm中,函数内部的变量,如果和函数被调用的外部的变量一样的话,就会被叫做shadows name,不容易被觉察到。
那么我们就不能在函数内部修改全局变量的值吗?当然不是,在python的函数中可以通过global关键字,调用并修改全局变量的值!
在函数内部修改全局变量的值
我们只需要在需要使用全局变量的前一行代码加上global + 全局变量,就可以随意修改全局变量的值啦!
可以看出,pycharm这次就没再提示shadows name了,因为我们从头到尾都是在使用同一个变量,即全局变量。所以我们一定要牢记,想要对全局变量进行修改时,在函数内部一定要加上global关键字,不然函数就会自动创建一个局部变量,使人产生误解。
Tips:
1、注意查看pycharm的warning,有时候可以帮助我们避免bug
2、在创建全局变量是按照gl_ + 全局变量 或者 global_ + 全局变量的命名方式,可以帮助我们更好地区分全局变量和局部变量
1.变量命名
1)命名的规范性
变量名可以包括字母、数字、下划线,但是数字不能做为开头。
系统关键字不能做变量名使用
除了下划线之个,其它符号不能做为变量名使用 !
Python的变量名是除分大小写的
2)编程语言常用驼峰命名法
大驼峰:每一个单词的首字母都大写 FirstName LastName
小驼峰:第一个单词以小写字母开始,后续单词的首字母大写 firstName lastName
但是在python中一般使用小驼峰加下划线的方式
has_error
is_person
2. 变量命名的描述性
在接受范围内,变量名所描述的内容越精准越好。
BAD: day, host, cards, temp
GOOD: day_of_week, hosts_to_reboot, expired_cards
变量名能让人猜出类型。
例如: Bool 类型
is_user : 是否是用户
例如: int/float 类型
port:端口号
age:年龄
这些很直观的能让人猜出类型。
注意: 不要使用复数来表示一个 int 类型变量,比如 apples,最好用 number_of_apples来替代。
3.变量名尽量短,但是不要太短
一个好的变量名,长度应该控制在两到三个单词左右
例如,person_index
同一段代码内不要使用过于相似的变量名,比如同时出现 users、users1、 user3。
不要使用带否定含义的变量名,用 is_special 代替 is_not_normal。
4.合理使用变量
同一个变量名指代的变量类型,也需要保持一致性。
在一个函数中,一个变量名叫做 photo, 那么在其他地方就不要改成image。
---------------------------------------------------------------------------------------------------------------------------------