|||
一、With函数的用法
With[{x=x0,y=y0,...},expr]
specifies that in expr occurrences of the symbols x, y, ... should be replaced by x0,y0,... .
关于With函数,有两点必需注意:
1、在With函数中出现的局部变量必需赋初值,With[{x,y,...},expr]是不合法的。
2、在With函数中出现的局部变量不可在expr中再被赋值。
例1:
In[1]:= With[{x}, Print[x]]
With::lvws: Variable x in local variable specification {x} requires a value. >>
Out[1]= With[{x}, Print[x]]
例2:
In[2]:= With[{x = 5}, x = 4]
Set::setraw: Cannot assign to raw object 5. >>
Out[2]= 4
二、Module函数的用法
Module[{x,y,...},expr]
specifies that occurrences of the symbols x, y,... in expr should be treated as local.
Module[{x=x0,...},expr]
defines initial values for x,... .
关于Module函数,有一点必需注意:
Module中的局部变量{x,y,...}会相应地被重先定义为{x$nnn,y$nnn,...}(这里nnn代表某一整数,随使用次数变化),同时,expr中出现的所有x,y,...都会相应地被x$nnn,y$nnn,...所替代。
例:
In[1]:= Module[{t}, Print[t]]
Module[{t}, Print[t]]
Module[{t}, Print[t]]
t$115
t$116
t$117
三、Block函数的用法
Block[{x,y,...},expr]
specifies that expr is to be evaluated with local values for the symbols x, y,... .
Block[{x=x0,...},expr]
defines initial local values for x,... .
关于Block函数,有一点必需注意:
与Module一样同样定义了一组{x,y,...}的局部变量,但没有{x,y,...}被{x$nnn,y$nnn,...}替代这一步。因此局部变量如果没有在Block中赋初值,则使用全局变量的值代替。
例:
In[1]:= i=2;
In[2]:= Block[{i},i+a]
Out[2]:= 2+a
In[3]:= Module[{i}, i + a]
Out[3]:= a + i$16
四、三个函数的共同点
三个函数都各自定义了一组局部变量,对局部变量的使用不会导致全局变量的值的变化。
例:
In[1]:= x = 3;
With[{x = 4}, x]
Module[{x = 5}, x = x^2]
Block[{x = 6}, x = x^2]
x
Out[2]= 4
Out[3]= 25
Out[4]= 36
Out[5]= 3
五、三个函数的不同点
1、在With函数中出现的局部变量必需赋初值,且在With函数中出现的局部变量不可在expr中再被赋值,其它两个函数没此限制。
2、在Block函数中,若定义的局部变量没有被赋初值,则使用全局变量的值,而在Module函数中,由于局部变量都被重先定义为新的量变,因此不可能使用全局变量。
如上例所述:
In[1]:= i=2;
In[2]:= Block[{i},i+a]
Out[2]:= 2+a
In[3]:= Module[{i}, i + a]
Out[3]:= a + i$16
3、在运行With[{x=x0,y=y0,...},expr]时,不管expr执不执行,x、y的初值x0、y0都得首先代入到expr中,而Module和Block是首先执行expr,然后再代初值。
例:
In[1]:= {With[{x = 5}, Hold[x]], Module[{x = 5}, Hold[x]], Block[{x = 5}, Hold[x]]}
Out[1]= {Hold[5], Hold[x$115], Hold[x]}
4、在速度方面,With的运行速度最快,其次是Block,最后是Module。
例:
In[1]:= Do[With[{x = 5}, x;], {10^5}] // Timing
Do[Block[{x = 5}, x;], {10^5}] // Timing
Do[Module[{x = 5}, x;], {10^5}] // Timing
Out[1]= {0.078, Null}
Out[2]= {0.094, Null}
Out[3]= {0.25, Null}
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-24 12:47
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社