一 变量的作用域
变量声明的位置不同,其可以被访问的范围也不同。变量的可被访问范围称为变量的作用域。变量按其作用域大致可以分为全局变量、局部变量和类成员变量。
全局变量
在一个源代码文件中,在函数和类定义之外声明的变量称为全局变量。全局变量的作用域为其定义的模块,从定义的位置起,直到文件结束位置。
通过 import 语句导入模块,也可以通过全限定名称“模块名.变量名”访问;或者通过 from…import 语句导入模块中的变量并访问。不同的模块都可以访问全局变量,这会导致全局变量的不可预知性。如果多个语句同时修改一个全局变量,则可能导致程序产生错误,且很难发现和更正。
全局变量降低了函数或模块之间的通用性,也降低了代码的可读性。在一般情况下,应该尽量避免使用全局变量。全局变量一般作为常量使用。
局部变量
在函数体中声明的变量(包括函数参数)称为局部变量,其有效范围(作用域)为函数体。
全局代码不能引用一个函数的局部变量或形式参数变量;一个函数也不能引用在另一个函数中定义的局部变量或形式参数变量。如果在一个函数中定义的局部变量(或形式参数变量)与全局变量重名,则局部变量(或形式参数变量)优先,即函数中定义的变量是指局部变量(或形式参数变量),而不是全局变量。
全局语句 global
在函数体中可以引用全局变量,但如果函数内部的变量名是第一次出现且在赋值语句之前(变量赋值),则解释为定义局部变量。
如果要为定义在函数外的全局变量赋值,可以使用 global 语句,表明变量是在外面定义的全局变量。
global语句可以指定多个全局变量,例如 global x, y, z 。一般应该尽量避免这样使用全局变量,全
局变量会导致程序的可读性差。
pi = 3.141592653589793
e = 2.718281828459045
def my_func():
global pi
pi = 3.14
print('global pi = ', pi)
e = 2.718
print('local e = ', e)
print('module pi = ', pi)
print('module e = ', e)
my_func()
print('module pi = ', pi)
print('module e = ', e)
结果:
module pi = 3.141592653589793
module e = 2.718281828459045
global pi = 3.14
local e = 2.718
module pi = 3.14
module e = 2.718281828459045
非局部语句 nonlocal
在函数体中可以定义嵌套函数,在嵌套函数中如果要为定义在上级函数体的局部变量赋值,可以使用nonlocal语句,表明变量不是所在块的局部变量,而是在上级函数体中定义的局部变量。nonlocal语句可以指定多个非局部变量,例如 nonlocal x,y,z 。
def outer_func():
tax_rate = 0.17
print('outer func tax rate = ', tax_rate)
def inner_func():
nonlocal tax_rate
tax_rate = 0.05
print('inner func tax rate = ', tax_rate)
inner_func()
print('outer func tax rate = ', tax_rate)
outer_func()
结果:
outer func tax rate = 0.17
inner func tax rate = 0.05
outer func tax rate = 0.05