global variable(全局变量)
global variable(全局变量),这个概念基本上在所有的主流编程语言中都有,但是在不同的编程语言中,他们的含义是不一样的。
以C语言为例,其全局变量是指定义(声明)在C文件的所有函数以外的变量,它们的作用域从其定义的地方开始,直到这个文件的结尾,在C语言中,全局变量是以文件为单位的(如果一个变量是全局变量,我们指的是这个变量在这个文件内是全局的,如果不用extern声明,那么在其他文件中,这个变量在那个文件中仍然是不可见的)。其实,C语言中处理全局变量的方式是大部分编程语言的处理方式。
但是Matlab中处理全局变量有一种不同的方式。
Matlab中的workspace,在Matlab中,global声明是针对Workspace的,所以要搞清楚Matlab的global是怎样工作的,那么就要先说说Matlab的workspace。Matlab中的代码可以位于三种不同的地方,第一种是直接在其command line中写的代码,这些代码的输入参数来自于当前Workspace,而输出也进入当前Workspace;第二种代码是写在一个script中的,这些代码的输入输出对一个与当前script同名的workspace起作用;第三种代码写在一个function中,这种代码的输入输出对一个与当前的函数名相同的workspace起作用(nested function除外)。
Matlab中有一个特殊的workspace叫做Base workspace,上面说过,所有的script运行的时候都会有操作一个和其同名的workspace,实际上,所有的script对应的workspace中的内容都和Base workspace是一样的,也就是说,所有的script都在操作一个workspace,那就是Base workspace。当然,Base workspace还要受command line的控制因为command line影响的是当前的workspace。
但是平时大家可能很少注意到有这么多的workspace,因为所有的这些workspace是只有在你使用Debug模式才能被看到的(所谓Debug模式,是指你在程序中加入了断点,程序跑到断点的位置会停下来)。如果你没有使用Debug模式,而是直接让程序直接跑,那么你的workspace Stack将是灰色的:
如果你使用Debug模式,那么你的workspace stack将是一个下拉列表框:上面说到的workspace当使用Debug模式的时候我们是可以看到的,而Matlab运行时还有一个workspace是怎么也不能直接看到的(可以通过命名看到),那就是global workspace,
其详细介绍见下一节。
Matlab中的global variable
说完了Mtalab的workspace,那么就可以说Matlab中的global variable了,在使用Matlab是,我们大部分时候会在函数中使用global,其实在Matlab中,global这个语句可以出现在上面所说的三种地方的任意一个地方,有了上面的workspace的介绍,要理解其所做的事情也是比较直接了。
当Matlab中出现了global语句时,Matlab会到global workspace中查找声明的变量是否已经在global workspace中存在了,如果不存在,那么Matlab会在global workspace中创建这个变量,并给其赋值空([]),并且在当前的workspace中创建一个也其同名的变量,这个变量实际上是global workspace中的变量的link,其值会保持和global workspace中的值一样;如果这个变量已经存在了,那么不会在global workspace中重新创建这个变量,而是直接在当前的workspace中创建一个与其同名的变量,其也是global workspace中的变量的link。所以当我们更新一个global变量的时候,所有对其声明了global的workspace中都会同时更新。
clear global variable因为global variable实际存在于global workspace,而在各个使用了的workspace中有其link,所以使用clear时会表现得有点不同。
当我们使用clear name删除一个变量时,如果这个变量是global声明出来的,那么这条命令实际上只删除了当前workspace中的link,对global workspace和其他workspace中的值没有影响。就算我们使用这条命令删除了所有workspace中的link,global workspace中的值还是没有删除的。
如果我们真的要删除一个global variable,那么我们必须使用
clear global name
这样变量将从global workspace和所有其他的workspace中同时删除。当然,我们也可以使用clear all,因为clear all是包含了clear global的。