gpt4 book ai didi

function - Set ( = ) 和 SetDelayed ( := )? ) 有什么区别

转载 作者:行者123 更新时间:2023-12-04 00:12:06 26 4
gpt4 key购买 nike

这个讨论来自 previous question我有兴趣了解两者之间的区别。带有示例的插图会很好。

最佳答案

基本示例

这是列昂尼德·希夫林 (Leonid Shifrin) 书中的一个例子 Mathematica programming: an advanced introduction

这是解决此类问题的绝佳资源。见:(1) (2)

ClearAll[a, b]

a = RandomInteger[{1, 10}];

b := RandomInteger[{1, 10}]
Table[a, {5}]
  {4, 4, 4, 4, 4}
Table[b, {5}]
  {10, 5, 2, 1, 3}

Complicated Example

The example above may give the impression that once a definition for a symbol is created using Set, its value is fixed, and does not change. This is not so.

f = ... assigns to f an expression as it evaluates at the time of assignment. If symbols remain in that evaluated expression, and later their values change, so does the apparent value of f.

ClearAll[f, x]

f = 2 x;
f
  2 x
x = 7;
f
  14
x = 3;
f
  6

It is useful to keep in mind how the rules are stored internally. For symbols assigned a value as symbol = expression, the rules are stored in OwnValues. Usually (but not always), OwnValues contains just one rule. In this particular case,

In[84]:= OwnValues[f]

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

现在对我们来说重要的部分是 r.h.s.,其中包含 x作为象征。评估真正重要的是这种形式 - 规则在内部存储的方式。只要 x在赋值时没有值,两者都是 SetSetDelayed在全局规则库中生成(创建)相同的规则,这才是最重要的。因此,它们在此上下文中是等效的。

最终结果是一个符号 f具有类似函数的行为,因为它的计算值取决于 x 的当前值.然而,这不是一个真正的函数,因为它没有任何参数,并且只触发符号 x 的变化。 .一般来说,不鼓励使用这种结构,因为对全局符号(变量)的隐式依赖在 Mathematica 中与在其他语言中一样糟糕——它们使代码更难理解,错误更微妙,更容易被忽视。一些相关的讨论可以找到 here .

用于函数的集合
Set可以用于函数,有时也需要。让我给你举个例子。这里 Mathematica 象征性地求解和,然后将其分配给 aF(x),然后用于绘图。
ClearAll[aF, x]

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

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

enter image description here

另一方面,如果您尝试使用 SetDelayed然后将要绘制的每个值传递给 Sum功能。这不仅会慢得多,而且至少在 Mathematica 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))

关于function - Set ( = ) 和 SetDelayed ( := )? ) 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5320330/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com