夜光序言:
心如止水,方能气贯长虹。
正文:
3.2 Python 变量范围
3.3.1 夜光:目标
在程序我们看到主程序中包含了函数,在函数内部有自己的变量,在主程序也有自己的变量,那么这些变量是什么关系,怎么样在函数内部取使用主程序的变量。
目标就是要分清这些变量的性质,掌握局部变量与全局变量的使用。
3.2.2 局部变量
局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,
离开该函数后再使用这种变量是非法的。
例 3-2-1: 局部变量。
def sum(m):
s=0
for p in range(m+1):
s=s+p
# 计算(1+2+……m)的和
return s
m=10
s=sum(m)
print(s)
其中 m、p、s 变量都是局部变量,关于局部变量的作用域还要说明以下几点:
(1) 函数中定义的变量只能在函数中使用,不能在其它函数中使用。同时,一个函数中也不能使用其它函数中定义的变量。各个函数之间是平行关系,每个函数都封装了一块自己的区域,互不相干。
(2) 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
(3) 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。例中 sum 函数的 m、s 变量与主程序的 m、s 变量同名,但它们是不同的变量。
例 3-2-2: 局部变量。
def fun(x, y) :
print("In fun:",x,y)
x=1
y=2
x=100
y=200
fun(x,y)
printf(x,y)
执行该程序,结果:
In fun 100 200
100 200
主程序中的 x、y 变量是主程序的局部变量,fun 中的 x、y 变量是 fun 的局部变量,所以主程序中的 x 与 fun 中的 x 不同,主程序中的 y 与 fun 中的 y 不同,所以在调用 fun 后主程序的 x、y 的值不变。
3.2.3 全局变量
1、全局变量的作用域
如果一个函数内部要用到主程序的变量,那么可以在这个函数内部声明这个变量为global 变量,这样函数内部用的就是主程序的变量了。当在函数中改变了全局变量的值时,会直接影响到主程序这个变量的值。
例 3-2-3: 全局变量。
def fun(x):
global y
y=0
x=0
x=1
y=2
fun(x)
print(x,y)
执行该程序结果为:
1 0
那是因为在 fun 函数中我们使用了 global y 声明 fun 中使用的 y 不是 fun 本地的 y 变量,而是主程序的 y 变量。
例 3-2-4: 全局变量。
def A(x):
global y
y=0
x=0
def B(x):
global y
y=10
x=0
x=1
y=2
A(x)
B(x)
print(x,y)
执行该程序结果为:
1 10
那是因为在 A,B 函数中我们使用了 global y 声明 A,B 中使用的 y 不是本地的 y 变量,而是主程序的 y 变量。
2、全局变量与局部变量
前面已经讲到全局变量的作用域是整个程序,它在程序开始时就存在,任何函数都可以访问它,而且所有函数访问的同名称的全局变量是同一个变量,全局变量只有在程序结束时才销毁。
局部变量是函数内部的范围内的变量,当执行此函数时才有效,退出函数后局部变量就销毁。不同的函数之间的局部变量是不同的,哪怕同名字也互不相干。
局部变量有局部性,这使得函数有对立性,函数与外界的接口只有函数参数与它的返回值,使程序的模块化更突出,这样有利于开发大型的程序。
全局变量具有全局性,是实现函数之间数据交换的公共途径,但大量地使用全局变量会破坏函数的独立性,导致程序的模块化程度下降,因此要尽量减少使用全局变量,多使用局部变量,函数之间应尽量保持其独立性,函数之间最好只通过接口参数来传递数据。
3.2.4 【案例】省份与城市的输入与显示
1、案例描述
用一个函数输入省份与城市,用另外一个函数显示。
2、案例分析
设计一个输入函数 enter,它输入省份 province 与城市 city,用另外一个函数 show 显示它们,由于 enter 要返回 province,city 两个数据,我们暂时还没有办法做到,因此把province,city 设计成全局变量。
3、案例代码
def enter():
global province
global city
province=input("省份:")
city=input("城市:")
def show():
print("省份:"+province+" 城市:"+city)
province=""
city=""
enter()
show()
执行结果:
省份:广东
城市:深圳
省份:广东 城市:深圳