一、变量(variable)
在Python中,变量是表示(或指向)特定值的名称。
例如,我们可能想使用名称a来表示2,为此执行下列代码:
a = 2
这称为赋值(assignment),将值2赋给了变量a。也就是变量a与值(或对象)2关联起来。
给变量赋值后,就可以在表达式中使用它。例如:
a+2
输出结果为:
4
注意:在使用Python变量前,必须先给它赋值,而且,变量名称只能由字母、数字和下划线组成,并且不能以数字开头;
另外Python中的关键字和函数名不能作为变量名使用
用关键字做变量名会报错,用函数名做变量名不会报错,但是一旦用函数名定义变量,函数将失去原来的函数作用,变成单纯的变量名称,这时候需要删除变量才能恢复函数名称原来的函数作用:
二、局部变量和全局变量
函数有两种连接变量的方式:全局和局部。
这里的全局和局部是相对于单个自定义函数而言的。全局变量的作用域(python中作用域也叫命名空间)是全局,而局部变量的作用域(命名空间)仅限于单个的自定义函数内部。例如:
变量a在函数test1内部进行的赋值,所以a的作用域仅限于test1函数内部,a为局部变量
局部作用域在函数被调用时生成,并立即由函数的参数填充,一般情况下,当函数执行结束后,局部作用域就会被注销。所以,局部变量a在test1函数退出时就被注销了,在函数外部调用a的时候会报错。
变量b在函数test2外部进行的赋值,所以b的作用域不仅限于test2内部,b为全局变量
那么,新的问题来了,如果在自定函数的时候,既有全局变量,又有局部变量,而且全局变量名称和局部变量名称相同,这种情况会产生什么样的结果呢?
局部变量和全局变量重名,如果函数内部有局部变量,函数调用的是自己内部的局部变量;如果函数内部没有定义局部变量,函数调用的是函数外部同名的全局变量。
三、修改全局变量
出现一个新的需求,能否在函数内部对全局变量进行修改?
通过global关键字在函数内部对全局变量进行修改
global关键字的本质作用是把局部变量转化成全局变量,在没有定义全局变量的情况下来看会更明显的显示global关键字的作用
在前边定义局部变量a的例子中,没有使用global关键字,在函数体外调用变量a的时候发生报错提示变量a不存在。在这里用了global关键字把局部变量e转化成了全局变量,再在函数体外调用变量e的时候没有报错并返回了变量e指向的值。
修改全局变量的一个陷阱
表面上看没有通过global关键字就改变了全局变量,真实情况也是这样的吗?
其实并不是这样的!一开始对变量名称的定义就说明了,变量是指向了值,其本质是“值的一个引用”,而不是“变量的取值”。所以,上边代码图片虽然显示全局变量是从[1]变到了[1,1],实际上不是全局变量的指向发生了变化,能看到前后指向的ID是一样的!发生变化的原因在于定义的全局变量是可变的数据类型而已!