Wolfram mathematica 为什么违约行为会如此?
可以为函数的参数设置Wolfram mathematica 为什么违约行为会如此?,wolfram-mathematica,Wolfram Mathematica,可以为函数的参数设置默认值: Default[f] = 5; 然后使用: f[a_, b_.] := {a, b} f[1, 2] f[1] {1, 5} 我们看到没有使用新值 因此,我的问题是: 为什么f[a_uu,b_u.]:={a,b}使用的默认值不随DefaultValues更改 其中存储的是实际默认值(5),因为它不出现在DownValues或DefaultValues中 从 在将用作f的参数之前,必须始终定义默认[f]的必要值 设置Default[f]=9后重新定义f使用新的
默认值
:
Default[f] = 5;
然后使用:
f[a_, b_.] := {a, b}
f[1, 2]
f[1]
{1, 5}
我们看到没有使用新值
因此,我的问题是:
- 为什么
使用的默认值不随f[a_uu,b_u.]:={a,b}
更改DefaultValues
- 其中存储的是实际默认值(
),因为它不出现在5
或DownValues
中DefaultValues
用作f
的参数之前,必须始终定义默认[f]
的必要值
设置Default[f]=9后重新定义f
代码>使用新的默认值。所以我猜它是第一次在内部定义,f
被定义,即使DefaultValue@f
存储新值。不是答案,而是:
使用在重新定义函数之前保持原始默认值的行为,建议快速解决以下问题:
在进行任何其他定义之前,为默认值定义一个全局变量
In[1]:= Default[f]:=$f
In[2]:= f[a_.]:=a
In[3]:= f[]
Out[3]= $f
In[4]:= $f=5; f[]
Out[5]= 5
In[6]:= $f=6; f[]
Out[7]= 6
In[8]:= $f=.; f[]
Out[9]= $f
这也适用于可选
In[1]:= g[a_:$g] := a
In[2]:= g[]
Out[2]= $g
In[3]:= $g=1; g[]
Out[4]= 1
我发现,在地方法规的情况下,这种行为是由于
比较:
In[1]:= Default[f] = 5;
replaceAll[f[1],
f[a_, b_.] :> Unevaluated@{a, b}] /. (Default[f] = 9; replaceAll) ->
ReplaceAll
Default[f] = 5;
Block[{RuleDelayed},
replaceAll[f[1],
f[a_, b_.] :> Unevaluated@{a, b}] /. (Default[f] = 9;
replaceAll) -> ReplaceAll]
Out[2]= {1, 5}
Out[4]= Unevaluated[{1, 9}]
人们可以看到Block
ingRuleDelayed
使本地规则的行为符合人们的预期。+1非常清晰。让我们期待同样的答案!W:你为什么不将默认值定义为f[a,b:5]:=…
?@yoda:因为可以在需要时更改默认值。@yoda另外,如果default
值很长和/或经常使用,那么编写.
要干净得多。我正在添加[bug]标记。如果一个WRI开发者想要解释为什么这不是一个bug,我会删除它。但是它内部存储在哪里?旧的默认值似乎没有出现在任何*值中。
..@W先生:对不起,这更多的是一个可能的解释,而不是一个具体的答案(以防您在文档中遗漏了这一部分)。此外,由于这是有记录的行为,我不明白第一个问题的要点(它是什么)。但是第二个问题,我真的不知道,我也没有试图回答。我想我应该把我的意图说清楚。如果说得不客气,我很抱歉。我知道其他人(除了主持人)看不到我的投票,但不知何故,我觉得我需要解释为什么我没有投票支持这个,我担心这听起来有点贬义。至于默认值
,我认为您在回答中的引用并不排除默认值[f]
以后可能会更改,并且该更改将影响早期使用。(检查DownValues
表明这应该有效。)相反,它告诉我在没有定义的默认值的情况下使用.
可能或将在赋值过程中注册为错误。@yoda问题似乎与全局规则有关。您可以在本地使用f
尝试您的示例:f[1]/。f[a,b.]:>{a,b}
(首先删除其全局定义),并查看它对默认[f]
的更改是否敏感。我的猜测是,在定义时,全局规则(定义)可能会经历一些内部优化,这需要在定义时使用Default
。定义完成后,它会得到优化,并对默认值[f]
的更改不敏感,除非我们有一个间接级别,如@Simon的回答中所述。@Alexey我不清楚这是发生在一般评估中,还是只与集
和集延迟
的评估有关,以及分配过程。因为我怀疑后者(否则不清楚为什么在f[1]/.f[a,b.]:>{a,b}
中对局部规则中的可选模式的求值不会导致相同的默认-不敏感行为),并且因为Set
和SetDelayed
生成全局规则,我称之为“全局规则效应”。
{HoldPattern[Default[f]] :> 5}
{HoldPattern[f[a_, b_.]] :> {a, b}}
Default[f] = 9;
DefaultValues[f]
{HoldPattern[Default[f]] :> 9}
f[1]
{1, 5}
In[1]:= Default[f]:=$f
In[2]:= f[a_.]:=a
In[3]:= f[]
Out[3]= $f
In[4]:= $f=5; f[]
Out[5]= 5
In[6]:= $f=6; f[]
Out[7]= 6
In[8]:= $f=.; f[]
Out[9]= $f
In[1]:= g[a_:$g] := a
In[2]:= g[]
Out[2]= $g
In[3]:= $g=1; g[]
Out[4]= 1
In[1]:= Default[f] = 5;
replaceAll[f[1],
f[a_, b_.] :> Unevaluated@{a, b}] /. (Default[f] = 9; replaceAll) ->
ReplaceAll
Default[f] = 5;
Block[{RuleDelayed},
replaceAll[f[1],
f[a_, b_.] :> Unevaluated@{a, b}] /. (Default[f] = 9;
replaceAll) -> ReplaceAll]
Out[2]= {1, 5}
Out[4]= Unevaluated[{1, 9}]