2011-06-28 63 views
12

测试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]。

+13

在谓词测试中使用SameQ(===)而不是Equal。 –

+0

就是这样!平等。我必须检查为什么有差异。 –

+4

我在这里覆盖这个主题:http://www.mathprogramming-intro.org/book/node24.html –

回答

12

正如指出的丹尼尔(和狮子座的书解释)Null == 0不求值TrueFalse,所以If声明(书面),也没有评价。 Null是一个特殊的Symbol,它不会在输出中显示,但是在所有其他方面,它的行为就像一个普通的日常符号。

In[1]:= Head[Null] 
Out[1]= Symbol 

对于一些未定义的符号x,你不想x == 0返回False,因为x可能为零以后。这就是为什么Null == 0也不能评估。

这有两种可能的解决方法:

1)力测试使用TrueQSameQ评估。
对于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} 
6

另一种可能性是有两个DownValues,一个用于特殊条件空,和您的正常定义。这有一个好处,你不需要担心第二个空值。

f[Null] := 1 

f[x_] := x^2 (* no weird Null^2 coming out of here! *)