局部常量

With[{x=x0,y=y0,...},body]定义局部常量 xy, ...

定义局部常量.

Module 中可以定义局部变量,这样我们可以对其赋值并且改变其值. 然而,通常我们所需要的是局部常量,对其我们仅需要赋值一次. Mathematica 中的 With 结构可以建立局部常量.

定义 的全局值.
In[1]:=
Click for copyable input
Out[1]=
定义把 作为局部常量的函数.
In[2]:=
Click for copyable input
使用定义 .
In[3]:=
Click for copyable input
Out[3]=
仍然具有它的全局值.
In[4]:=
Click for copyable input
Out[4]=

与模块 Module 中的情况相似,用 With 定义的初始值在 With 执行之前进行计算.

给局部常量 赋值的表达式 的全局值进行计算.
In[5]:=
Click for copyable input
Out[5]=

With[{x=x0, ...}, body] 的工作方式是取 body,并用 代替 x,等等. 可以将 With 理解为 运算的推广,可适用于 Mathematica 的代码.

使用 替换 .
In[6]:=
Click for copyable input
Out[6]=
替代以后,With 的内容是 ,故 得到了全局值 .
In[7]:=
Click for copyable input
Out[7]=
清除 的值.
In[8]:=
Click for copyable input

在某种意义上,With 类似于局部变量仅赋值一次的 Module 的特殊形式.

With 而不用 Module 的主要原因之一是使 Mathematica 程序容易理解. 在模块中的某一处遇到局部变量 x 时很可能需要跟踪整个模块的代码来得到 x 在该处的值. 而在 With 结构中,只需要观察初始值列表就能得到局部常量的值.

有几个 With 结构时,总是某一个变量最里面的一个起作用. 可以将 ModuleWith 混用. 一般原则是某一变量最里面的一个起作用.

在嵌套 With 结构中,总是最里面的一个起作用.
In[9]:=
Click for copyable input
Out[9]=
可以将 ModuleWith 结构混用.
In[10]:=
Click for copyable input
Out[10]=
当名字不重合时,结构内的局部变量不屏蔽结构外的变量.
In[11]:=
Click for copyable input
Out[11]=

除了 xbody 在何时计算外,With[{x=x0, ...}, body] 的做法基本类似. 然而,当表达式 body 内部都包含 WithModule 结构时, With 显示特殊的状态. 主要的问题是防止不同 With 结构中的局部常量相互冲突,或与全局目标冲突. 有关细节将在 "模块工作方式" 节讨论.

With 内部的 被重新命名以防止它与全局变量 冲突.
In[12]:=
Click for copyable input
Out[12]=
New to Mathematica? Find your learning path »
Have a question? Ask support »