此为 Mathematica 4 文档,内容基于更早版本的 Wolfram 语言
查看最新文档(版本11.1)

2.4.8 立即定义和延时定义

Mathematica 中有两种赋值形式: lhs = rhslhs := rhs,其主要 区别是什么时候计算 rhs 的值. lhs = rhs 是立即赋值,即 rhs 是在赋值时立即计算, 而 lhs := rhs 则是延时赋值,即赋值时并不计算 rhs,而是在需要 lhs 的 值时才进行计算.

Mathematica 中的两种赋值形式

:= 定义 ex

由于使用了 :=,该定义中仍然保持没有计算之前的形式

使用 = 赋值时,右端立即被计算出来

现在保存的定义是 Expand 的结果

当执行 ex 时,就调用 Expand

iex 将它的变量替换到已展开的形式中去,给出不同形式的结果

由上面的例子看出 = 和 := 都可以用来定义函数,要特别注意它们的差异. 一个常用的原则 是:当一个表达式的值再不改变时用 = ,而通过赋值求表达式的一个值时用 := .在无法确定时用 := 总比用=好一些.

=:= 赋值的含意

尽管 := 比 = 用得多一些,但还有必须用 = 定义函数的一个重要情形. 当进行一个运算得到具有符号参数 x 的结果时,还需要进一步得到对应于不同 x 的结果,一种方式是用 /. 将适当的规则用于 x,通常用=去定义变量 x 的函数 就较方便一些.

涉及 x 的一个表达式

定义一个自变量可用 x 的值代入的值函数

x1+a 时的结果

上面例子中值得注意的一点是在模式 x_ 中出现的名称没有任何特殊之处,它仅是一个符号,与其它表达式中出现的 x 没有区别.

定义表达式值的函数

= 和 := 不仅用来定义函数,还用来给变量赋值, x = value 立即求 value 的值,并将其赋于 x,而 x := value 不立即求值,每次使用 x 时才计算其值.

求出一个伪随机数,赋给 r1

Random[ ] 先不计算,在每次使用 r2 时进行计算

此处给出 r1r2 的值

r1 的值维持不动,每次使用 r2 时就产生一个伪随机数

在一系列值语句中,要特别注意立即赋值和延时赋值的区别.

a=1

计算 a+2 得到 3,将结果赋于 ri

a+2 先不计算,等到 rd 使用时求其值

此处 rird 值相同

此时 a 的值被改变

现在 rd 使用 a 的新值,而 ri 保持不动

可以用延时赋值 t := rhs 来设置在不同环境下有不同值的变量, 当每次需要 t 的值时,就用与 rhs 有关变量的当前值来计算它的值.

延时赋值的右端暂不计算

a=4,再求出 t 的值

a=6,再计算 t

在上面的例子中,a是一个全局变量,它的值决定了 t的大小.当参数中大部分偶尔才变化时,用这种方式是方便的. 但必须认识到明显 的或隐含的变量之间的依赖关系是容易混淆的,应该尽可能地使用函数 明确地反映依赖关系.

Mathematica 中的两种变换规则

与立即或延时赋值类似,可以建立立即或延时的变换规则.

给出规则时其左端立即计算

这类规则不一定十分有用

规则的右端暂不计算,每次使用规则时才求它的值

使用规则时就进行展开

与赋值的情形类似,当用确定的值代替表达式的值时用 ->,而当给出 一个求值的命令时用 :>.