zxysx的个人博客分享 http://blog.sciencenet.cn/u/zxysx

博文

Mathematica中的With,Module及Block的用法及区别

已有 17073 次阅读 2012-8-2 16:06 |个人分类:Mathematica|系统分类:科研笔记| 函数, with, module, Mathematica, block

一、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执不执行,xy的初值x0y0都得首先代入到expr中,而ModuleBlock是首先执行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}

 

 

 



https://blog.sciencenet.cn/blog-531885-598318.html

上一篇:The Hypergeometric Probability Distribution(超几何分布)
下一篇:The Poisson Probability Distribution(泊松分布)
收藏 IP: 210.75.252.*| 热度|

3 陈奎孚 亓欣波 lyfyy

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-13 15:06

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部