Mr.*_*ard 14 wolfram-mathematica
可以Default为函数的参数设置一个值:
Default[f] = 5;
Run Code Online (Sandbox Code Playgroud)
然后使用:
f[a_, b_.] := {a, b}
f[1, 2]
f[1]
Run Code Online (Sandbox Code Playgroud)
{1, 2}
{1, 5}
这将创建以下值:
DefaultValues[f]
DownValues[f]
Run Code Online (Sandbox Code Playgroud)
{HoldPattern[Default[f]] :> 5}
{HoldPattern[f[a_, b_.]] :> {a, b}}
从这个可能会认为该值5不是在定义中固定f,而是解决了DefaultValues赋值.但是,如果我们DefaultValues直接或使用以下方式更改:
Default[f] = 9;
DefaultValues[f]
Run Code Online (Sandbox Code Playgroud)
{HoldPattern[Default[f]] :> 9}
并f再次使用:
f[1]
Run Code Online (Sandbox Code Playgroud)
{1, 5}
我们看到没有使用新值.
因此,我的问题是:
为什么使用的默认值f[a_, b_.] := {a, b}不会改变DefaultValues?
哪里是真正的默认值(5)存储,因为它没有在任何出现DownValues或DefaultValues?
Sim*_*mon 10
不是答案,但是:
使用保留原始默认值的行为,直到重新定义函数为止,建议快速解决:
Default在进行任何其他定义之前定义全局变量.
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
Run Code Online (Sandbox Code Playgroud)
这也适用于 Optional
In[1]:= g[a_:$g] := a
In[2]:= g[]
Out[2]= $g
In[3]:= $g=1; g[]
Out[4]= 1
Run Code Online (Sandbox Code Playgroud)
从文档中,
Default[f]必须始终定义必要的值才能_.用作参数f.
f设置后重新定义Default[f] = 9;使用新的默认值.所以我的猜测是它是第一次在内部f定义,定义,即使DefaultValue@f存储新值也不会改变.