使用Which
时遇到问题。我在Mathematica中创建了一个函数,其中一个参数(arg2
)应该是Symbol
(None
或Full
)。
我希望函数的输出依赖于这样的arg2
,但它不起作用:
testFunction[arg1_,arg2_:None]:=Which[arg2==None,arg1*2,arg2==Full,arg1*3]
如果arg2
为None
似乎没有问题,但arg2
为Full
,testFunction
只会返回自己。
使用实数或整数而不是符号None
和Full
时,testFunction
可以正常运行。
我在测试中使用符号时犯了错误吗?或者在使用Which
和符号时我应该注意其他“规则”吗?
我已经在这个和其他网站上搜索答案,但找不到任何答案。 Mathematica帮助文件也没有为我提供答案。我看到的每个地方都没有使用巫婆符号。
答案 0 :(得分:5)
解决方案是使用SameQ
(即运算符===
)而不是Equal
(运算符==
)。
Equal
用于数学平等。 a==b
没有评估,这意味着Mathematica不知道这些变量是否具有相同的值。当1==2
评估为False
时,a==a
评估为True
。
SameQ
用于结构平等,并始终评估为True
或False
。如果被比较的表达式在结构上相等,它将仅评估为True
。它不会尝试测试数学上的等式,例如0 === 0.0
会给False
,因为这两个表达式在结构上是不同的(一个是精确数字,另一个是机器精度数字)。
在这里,您需要结构相等,因为您需要Full === None
来评估False
(而Full == None
保持未评估状态)。只需使用
testFunction[arg1_,arg2_:None]:=Which[arg2===None,arg1*2,arg2===Full,arg1*3]
答案 1 :(得分:1)
虽然使用SameQ
是一种解决方案,但我认为有更好的方法来构建它。 Switch
是最直接的替代品:
f[arg1_, arg2_: None] := Switch[arg2, None, arg1*2, Full, arg1*3]
f[7]
f[7, None]
f[7, Full]
14 14 21
通常最好避免使用哪种/开关等并使用模式,例如:
ClearAll[f]
f[arg1_, Full] := arg1*3
f[arg1_, None | PatternSequence[]] := arg1*2
f[7]
f[7, None]
f[7, Full]
14 14 21