什么是集(=)和SetDelayed之间的差异(:=)?

这个讨论前一个问题出来了,我很感兴趣,知道两者的区别。 插图用一个例子将是很好。

--------------解决方案-------------

基本示例

下面是狮子座希夫林的书数学编程的例子:一个高级介绍

正是出于这样的问题的一个很好的资源。 看到:(1)(2)

ClearAll[a, b]

a = RandomInteger[{1, 10}];

b := RandomInteger[{1, 10}]

表[A,{5}]

{4,4,4,4,4}

Table[b, {5}]

{10,5,2,1,3}


复杂的例子

上面的例子可以给出一次一个符号的定义是使用该创建的印象Set ,其值是固定的,并且不会改变。 事实并非如此。

f = ...分配给f一种表现,因为它计算在转让的时间。 如果符号保持在该评估的表达,后来他们的价值观改变,所以做的明显的价值f

ClearAll[f, x]

f = 2 x;
f

x = 7;
f

14

x = 3;
f

6

它是要记住如何的规则在内部存储有用。 用于分配一个值作为符号symbol = expression ,所述规则存储在OwnValues ​​。 通常(但不总是), OwnValues ​​只包含一个规则。 在这种特殊情况下,

In[84]:= OwnValues[f]

Out[84]= {HoldPattern[f] :> 2 x}

对我们来说,重要的部分现在是RHS,其中包含x为标志。 真正重要的评价是这种形式 - 规则在内部存储的方式。 只要x没有在转让时刻的值,两者SetSetDelayed农产品(创建)以上的全球规则库相同的规则,这是最重要的。 它们,因此,在这种情况下等效。

最终的结果是一个码元f具有功能类似的行为,因为其计算值取决于当前值x 。 这不是一个真正的功能,然而,由于它不具有任何参数,并触发符号的唯一变化x 。 一般情况下,使用这种结构应该气馁,因为对全球符号(变量)暗指的依赖是一样糟糕的数学,因为他们在其他语言 - 他们使代码更难理解和错误微妙,更容易被忽视。 有些相关的讨论可以在这里找到。


设置用于功能

Set可用于功能,有时它需要。 我给大家举一个例子。 在这里,数学符号解决了求和,然后分配,为AF(X),然后将其用于情节。

ClearAll[aF, x]

aF[x_] = Sum[x^n Fibonacci[n], {n, 1, \[Infinity]}];

DiscretePlot[aF[x], {x, 1, 50}]

什么是集(=)和SetDelayed之间的差异(:=)?

如果在另一方面,你尝试使用SetDelayed那么你传递给绘制的每个值Sum函数。 这不仅会慢很多,但至少在数学7,它完全失败。

ClearAll[aF, x]

aF[x_] := Sum[x^n Fibonacci[n], {n, 1, \[Infinity]}];

DiscretePlot[aF[x], {x, 1, 50}]

如果一个人想确保对于形式参数(可能全局值x此处)不干扰并限定一个新功能的过程中被忽略,到其他Clear是包装Block周围的定义:

ClearAll[aF, x];
x = 1;
Block[{x}, aF[x_] = Sum[x^n Fibonacci[n], {n, 1, \[Infinity]}]];

一看函数的定义证实,我们得到了我们想要的东西:

?aF
Global`aF
aF[x_]=-(x/(-1+x+x^2))

In[1]:= Attributes[Set]

Out[1]= {HoldFirst, Protected, SequenceHold}

In[2]:= Attributes[SetDelayed]

Out[2]= {HoldAll, Protected, SequenceHold}

正如你可以通过它们的属性看,这两个函数举行他们的第一个参数(要向其分配符号),但它们的区别在于SetDelayed还拥有第二个参数,而集不。 这意味着,设置将表达式计算结果为右=在完成分配的时间。 SetDelayed不表达评价到右侧:=直到变量被实际使用。

发生了什么事更清楚,如果分配的右手边有一个副作用(例如打印[]):

In[3]:= x = (Print["right hand side of Set"]; 3)
x
x
x

During evaluation of In[3]:= right hand side of Set

Out[3]= 3

Out[4]= 3

Out[5]= 3

Out[6]= 3

In[7]:= x := (Print["right hand side of SetDelayed"]; 3)
x
x
x

During evaluation of In[7]:= right hand side of SetDelayed

Out[8]= 3

During evaluation of In[7]:= right hand side of SetDelayed

Out[9]= 3

During evaluation of In[7]:= right hand side of SetDelayed

Out[10]= 3

:=是用于定义功能和=是设定值,基本上。

:=将评估时,其读取, =将在其设置评估。

想一想:

x = 2
y = x
z := x
x = 4

现在,z为4,如果评价,y是2仍

分类:功能 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.685 (s). 10 q(s)