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
ing
RuleDelayed
使本地规则的行为符合人们的预期。

+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}]