2011-06-28 113 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! *)