模块和局部变量

Mathematica 一般假设变量是全局 变量. 即每次使用 等名字时,Mathematica 总认为在调用同一对象.

然而在编程时,不需要将所有变量都作为全局变量. 例如,在两个不同的程序中, 可用来指代两个不同的变量. 此时,每个程序中的 都必须作为局部 变量.

Mathematica 中可以用 modules 定义局部变量. 在每个模块中,可以给出模块中涉及的局部变量列表.

Module[{x,y,...},body]具有局部变量 xy, ... 的模块

Mathematica 中产生模块

定义全局变量 ,其值为17.
In[1]:=
Click for copyable input
Out[1]=
这里 在模块内,所以它的处理与全局变量 无关.
全局变量 的值还是17.
In[3]:=
Click for copyable input
Out[3]=

模块的最常用方法是在自定义函数中建立临时或中间变量. 一定要保证这些变量只是局部的,否则当这些变量名与其它变量名重合成就会引起麻烦.

中间变量 是模块中的局部变量.
In[4]:=
Click for copyable input
运行函数 .
In[5]:=
Click for copyable input
Out[5]=
全局变量 的值还是17.
In[6]:=
Click for copyable input
Out[6]=

在模块中可以像处理其它符号一样处理局部变量. 例如,可以把它们作为局部函数的名字来用,可以对它们赋于属性,等等.

这里构造了一个建立局部函数 的模块.
In[7]:=
Click for copyable input
此处局部函数 是一般的阶乘.
In[8]:=
Click for copyable input
Out[8]=
这里, 是一个推广了的阶乘.
In[9]:=
Click for copyable input
Out[9]=

在一个模块中定义局部变量时,Mathematica 开始并不对它赋值. 即使在模块外定义了该变量的全局值,都能以纯符号的方式使用该变量.

这里使用了 在前面定义的全局值,故结果是一个数.
In[10]:=
Click for copyable input
Out[10]=
这里 Length 得到了变量的个数.
In[11]:=
Click for copyable input
Out[11]=
由于局部变量 没有赋值,因此被当作符号处理,Expand 产生了一个预期的代数结果.
In[12]:=
Click for copyable input
Out[12]=
Module[{x=x0,y=y0,...},body]局部变量有初始值的模块

对局部变量赋初值

这里指局部变量 的初始值为 .
In[13]:=
Click for copyable input
这里使用了 的定义.
In[14]:=
Click for copyable input
Out[14]=

对模块中任何一个局部变量都可以定义初始值. 这些初始值总是在模块执行之前进行计算. 结果,即使定义了 是模块的局部变量,在赋初始值时可以用全局变量 的值.

的初始值为全局变量 的值.
In[15]:=
Click for copyable input
Out[15]=
lhs:=Module[vars,rhs/;cond]rhscond 中共用局部变量

在条件定义中使用局部变量

在定义 时经常需要引入临时变量,并且定义的右端也需要使用这些临时变量. Mathematica 允许将定义的右端和条件包含在模块之中.

定义具有条件的函数.
In[16]:=
Click for copyable input
Mathematica 在条件和右端项中共用局部变量 的值.
In[17]:=
Click for copyable input
Out[17]=
New to Mathematica? Find your learning path »
Have a question? Ask support »