测试Mathematica中值是否为空的最好/最干净/最好的方法是什么?而不是空?在Mathematica中测试Null而不是空
例如:
a = Null
b = 0;
f[n_] := If[n == Null, 1, 2]
f[a]
f[b]
具有这样的结果:
1
If[0 == Null, 1, 2]
我在哪里会预期2对于f [B]。
测试Mathematica中值是否为空的最好/最干净/最好的方法是什么?而不是空?在Mathematica中测试Null而不是空
例如:
a = Null
b = 0;
f[n_] := If[n == Null, 1, 2]
f[a]
f[b]
具有这样的结果:
1
If[0 == Null, 1, 2]
我在哪里会预期2对于f [B]。
正如指出的丹尼尔(和狮子座的书解释)Null == 0
不求值True
或False
,所以If
声明(书面),也没有评价。 Null
是一个特殊的Symbol
,它不会在输出中显示,但是在所有其他方面,它的行为就像一个普通的日常符号。
In[1]:= Head[Null]
Out[1]= Symbol
对于一些未定义的符号x
,你不想x == 0
返回False
,因为x
可能为零以后。这就是为什么Null == 0
也不能评估。
这有两种可能的解决方法:
1)力测试使用TrueQ
或SameQ
评估。
对于n == Null
测试,以下内容将等同,但在测试数字对象时,它们不会。 (这是因为Equal
使用的数值等效近似的测试。)
f[n_] := If[TrueQ[n == Null], 1, 2] (* TrueQ *)
f[n_] := If[n === Null, 1, 2] (* SameQ *)
使用上述,条件语句就如同你想:
In[3]:= {f[Null], f[0]}
Out[3]= {1, 2}
2)使用可选的第四个参数If
如果测试仍未评估(即,如果它既不是True
也不是False
)
g[n_] := If[n == Null, 1, 2, 3]
然后
In[5]:= {g[Null], g[0]}
Out[5]= {1, 3}
另一种可能性是有两个DownValues,一个用于特殊条件空,和您的正常定义。这有一个好处,你不需要担心第二个空值。
f[Null] := 1
f[x_] := x^2 (* no weird Null^2 coming out of here! *)
在谓词测试中使用SameQ(===)而不是Equal。 –
就是这样!平等。我必须检查为什么有差异。 –
我在这里覆盖这个主题:http://www.mathprogramming-intro.org/book/node24.html –