块和局部值
Mathematica 中的模块使变量名具有局部性,但有时需要名是全局的,值是局部的,这可以用 Mathematica 中的Block 来实现.
| Block[{x,y,...},body] | 用 的局部值计算 body |
| Block[{x=x0,y=y0,...},body] | 给 赋初值 |
设置局部值.
涉及

的一个表达式.
| Out[1]= |  |
用

的局部值计算以前的表达式.
| Out[2]= |  |

没有全局值.
| Out[3]= |  |
如前一节 "模块和局部变量" 所述,在模块如 Module[{x}, body] 中的变量 x 总是有一个唯一符号,模块每次调用这符号不同,且与全局符号 x 也有区别. Block[{x}, body] 中的 x 是一个全局的符号 x. 这个块的作用是让 x 有局部值. 进入这个块时,x 的值在退出该块时恢复. 而在块执行时,x 可以取任意值.
给符号

设置值

.
| Out[4]= |  |

在块中给出了一个局部值.
| Out[7]= |  |
当块执行结束时,

恢复了以前的值.
| Out[8]= |  |
Mathematica 中的块设置了可以暂时改变值的一种环境. 在块执行过程中,用在块中所定义的变量的当前值计算表达式,不论表达式是该块的一部分或是在计算中某一处产生的情况都是如此.
这里定义了符号

的一个延时值.
在块之外计算

时,

的全局值被使用.
| Out[10]= |  |
可以指定

的临时值在块中使用.
| Out[11]= |  |
Mathematica 中的 Block 间接使用在 Do、Sum 和 Table 等的递推结构中.在所有这些结构中,Mathematica 利用 Block 建立了迭代递推变量的局部值.
Sum 自动使递推变量

是局部值.
| Out[12]= |  |
在递推结构中的局部变量比在
Block 中的更一般一些. 它们处理

、纯符号等变量.
| Out[13]= |  |
在 Mathematica 中定义函数时,用不直接给出变量,但能影响函数的全局变量是方便的. 例如,Mathematica 有一个全局变量 $RecursionLimit,它影响所有函数的计算但又不直接是函数的变量.
Mathematica 通常将所定义的全局变量的值保持到明显的改变了它为止,但也需要仅在一个计算过程中或某一项的计算中有效的值,这可以通过把它设置为 Mathematica 块的局部值来实现.
定义依赖于全局变量

的函数.
这里,使用了

的全局值.
| Out[15]= |  |
在块内,可以设置

的局部值.
| Out[16]= |  |
全局变量不仅可以用来设置函数的参数,还可以积累从函数得到的结果. 在块中设置这样的局部变量,可以积累在这个块执行过程中从所调用函数得到的结果.
此函数增加了全局变量

,返回的是它的当前值.
如果不用块,计算

时改变全局变量

的值.
| Out[18]= |  |
使用了块后,仅局部变量

被影响.
| Out[19]= |  |
全局变量

没有改变.
| Out[20]= |  |
当输入块如 Block[{x}, body] 时,x 的所有值被删除,这意味着在这个块内,可以把 x 当"符号变量"来处理. 然而,从块明确地返回了 x 以后,它就被在块外计算时产生的值所代替.
当输入块时,

的值被删除.
当返回含有

的表达式时,它就用

的全局值进行计算.
| Out[22]= |  |