变量是有作用范围的,有的变量只能在函数中使用,有的变量可以在整个程序中使用。变量的生存期则指变量从创建到从内存中消失的这段时间。
10.4.1变量的作用范围
【Excel VBA】
Excel VBA中,根据变量的作用范围不同,可以把变量分为全局变量、模块级变量和过程级变量。这里用到模块和工程的概念,请参见第13章的介绍。
全局变量在标准模块中声明并使用Public关键字。它的作用范围是整个工程。习惯上全局变量的变量名称第1个字母为g,例如:
Public gstrVar As String
全局变量的使用可以带来一些方便,但应该劲量避免使用它,因为在工程中任何地方都可以改变它的值,这样容易出错,而且出错后不好排查。另外全局变量在程序的执行中始终占用内存,可能会影响程序的运行效率。
模块级变量的作用域为它所在的模块,一般在模块顶部用Private或Dim关键字进行定义。它作用于模块中的所有过程和函数。习惯上,模块级变量名称的第1个字母为m,例如:
Private mlngColor As Long
过程级变量在过程或函数中定义,它们只能在本过程或函数中使用,级别最低。
【Python】
根据变量的作用范围,变量可分为局部变量和全局变量。局部变量是定义在函数内部的变量,只在对应函数内部有效。全局变量是在函数外面创建的变量,或者用global关键字声明的变量。全局变量可在整个程序范围内进行访问。
下面定义1个f1函数,函数中变量v为局部变量,它的作用范围就在函数f1内部。该文件路径为Samples\ch10\Python\sam10-010.py。
v=10 #给变量v赋值10
print(v)
def f1(): #函数f1,给局部变量v赋值20
v=20
f1() #调用f1函数
print(v)
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口显示下面的结果:
>>> = RESTART: …/Samples/ch10/Python\sam10-010.py
10
10
可见,调用f1函数前后变量v的值没有改变,即f1函数中设置变量v的值只在函数内部有效。
下面在f1函数中用global关键字将变量v声明为全局变量,修改它的值,然后查看它的作用范围。该文件路径为Samples\ch10\Python\sam10-011.py。
v=10
print(v)
def f1():
global v #用global关键字将变量v声明为全局变量
v=20 #修改v的值为20
def f2():
print(v) #输出变量v的值
f1() #调用函数f1
print(v)
f2() #调用函数f2
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口显示下面的结果:
>>> = RESTART: …/Samples/ch10/Python\sam10-011.py
10
20
20
可见,由于f1函数中变量v声明为全局变量,调用f1函数前后v的值发生了改变。而且在其他函数中也可以使用全局变量。
变量的生存期和Excel VBA中的静态变量
变量的生存期则指变量从创建到从内存中消失的这段时间,所以Excel VBA中过程级变量的生存期是创建它开始到运行超出过程范围时为止;模块级变量的生存期为创建它开始到运行超出本模块时为止;全局变量的生存期为创建它到程序结束运行时为止。
对于 Dim关键字声明的过程级变量,仅当它所在的过程在执行时这些变量才存在。当过程执行完毕,变量的值就不存在了,而且变量所占据的内存也被释放。下一次执行该过程时,它的所有过程级变量将重新初始化。
为了保留过程级变量的值,可将它们定义为静态变量。在过程内部用Static关键字声明一个或多个静态变量,其用法和 Dim 语句完全一样,例如:
Static sngSum As Single
下面的函数用AccuSum函数计算数值1到20的累加和:
Private Function AccuSum(intA As Integer) As Integer
Static intSum As Integer
intSum = intSum + intA
AccuSum = intSum
End Function
由于将intSum声明为静态变量,退出AccuSum函数时该变量会保留值。在同一模块中添加下面的测试过程。
Sub Test()
Dim intI As Integer
For intI = 1 To 10
Debug.Print AccuSum(intI);
Next
End Sub
运行程序,在立即窗口中输出数值1到10的累加和,如下所示。
1 3 6 10 15 21 28 36 45 55