变量可分为局部变量和全局变量,其作用域与变量是基本数据类型还是组合数据类型有关。
局部变量指的是定义在函数内的变量其作用范围是从函数定义开始到函数执行结束。
局部变量定义在函数内,只在函数内使用,它与函数外具有相同名称的变量没有任何关系。
例 6-19 局部变量的作用域:
>>> def func1(x,y): x1=x y1=y z=100 print("in func1(),x1=",x1) print("in func1(),y1=",y1) print("in func1(),z=",z) func2() return >>> def func2(): x1=10 y1=20 z=0 print("in func2(),x1=",x1) print("in func2(),y1=",y1) print("in func2(),z=",z) >>> func1('a','b') in func1(),x1= a in func1(),y1= b in func1(),z= 100 in func2(),x1= 10 in func2(),y1= 20 in func2(),z= 0
局部变量只能在声明它的函数内部访问,而全局变量可以在整个程序范围内访问。全局变量是定义在函数外的变量,它拥有全局作用域。
全局变量可作用于程序中的多个函数,但其在各函数内部只是可访问的、只读的,全局变量的使用是受限的。
例 6-20 函数外定义的全局变量在函数内读取:
#ex0620.py basis = 100 #全局变量 def func1(x,y): #计算总分 sum = basis + x + y return sum def func2(x,y): avg = (basis+x*0.9+y*0.8)/3 return avg score1 = func1(75,62) score2 = func2(75,62) print("-----------------------------") print("{:6.2f},{:6.2f}".format(score1,score2)) print(basis) print("-----------------------------")
运行结果如下:
----------------------------- 237.00, 72.37 100 -----------------------------
例 6-21 函数中如果定义了与全局变量同名的变量,其实质是局部变量:
#ex0621.py basis = 100 #全局变量 def func3(x,y): basis = 90 #该局部变量与全局变量同名,但与全局变量无关 sum = basis+x+y return sum print("{:6.2f}".format(func3(75,62))) print(basis) #全局变量的值仍为100 print("--------------------------------------")
运行结果如下:
227.00 100 --------------------------------------
例 6-22 函数中使用局部变量,导致程序异常:
#ex0622.py basis = 100 #全局变量 def func4(x,y): print(basis) basis = 90 #该局部变量与全局变量同名,但与全局变量无关 sum = basis+x+y return sum print("{:6.2f}".format(func3(75,62))) print(basis) #全局变量的值仍为100 print("--------------------------------------")
运行结果如下:
Traceback (most recent call last): File "D:/Desktop/Python3/PythonCode_test/Code/ex06/ex0622.py", line 9, in <module> print("{:6.2f}".format(func4(75,62))) File "D:/Desktop/Python3/PythonCode_test/Code/ex06/ex0622.py", line 4, in func4 print(basis) UnboundLocalError: local variable 'basis' referenced before assignment
全局变量不需要在函数内声明即可在函数内部读取。
当在函数内部给变量赋值时,该变量将被 Python 视为局部变量,如果在函数中先访间全局变量,再在函数内定义与全局变量同名的局部变量的值,程序也会报异常。
为了能在函数内部读/写全局变量, Python 提供了 global 语句,用于在函数内部声明全局变量。
例 6-23 global 语句的应用:
#ex0623.py basis = 100 #全局变量 def func5(x,y): global basis #声明 basis是函数外的全局变量 print(basis) #100 basis = 90 #该局部变量与全局变量同名,但与全局变量无关 sum = basis+x+y return sum print("{:6.2f}".format(func5(75,62))) print(basis) #90 print("--------------------------------------")
运行结果如下:
100 227.00 90 --------------------------------------
因为在函数内部使用了 global 语句进行声明,所以代码中使用到的 basis 都是全局变量。
Python 中还增加了 nonlocal 关键字,用于声明全局变量,但其主要应用在一个嵌套的函数中修改嵌套作用域中的变量。