在Mathematica中,==和===有什么区别?

13

我原本以为=是赋值,==是数值比较,===是符号比较(在其他一些语言中==表示等于===则表示完全相同)。然而,看了下面的例子似乎并非总是这样...

In: x == x
Out: True

In: x === x
Out: True

In: 5 == 5
Out: True

In: 5 === 5
Out: True

In: x = 5
Out: 5

In: 5 == x
Out: True

In: 5 === x
Out: True

In: 5 5 == 5x
Out: True

In: 5 5 === 5x
Out: True

In: x == y
Out: x == y

In: x === y
Out: False

In: y = x
Out: 5

In: x == y
Out: True

In: x === y
Out: True

那么在Mathematica中“==”和“===”到底有什么区别?我已经查看了文档,但仍然不太理解。


请参考此答案,了解EqualSameQ的数值行为的更多信息。 - Alexey Popkov
5个回答

16

一个重要的区别是,=== 总是返回 True 或者 False。而==可以返回未计算的结果(这也是它表示方程时有用的原因)。

In[7]:= y == x^2 + 1

Out[7]= y == 1 + x^2

In[8]:= y === x^2 + 1

Out[8]= False

在编程时,有一些有趣的情况会导致==返回未计算的值,值得我们注意。例如:

In[10]:= {} == 1

Out[10]= {} == 1 

这可能会影响像 If[foo=={}, <true>, <false>] 这样的东西。


14

===== 在返回相等时都会返回 True,它们非常相似。它们的区别在于,当你比较使用不同表示格式的数字时。

In: 5.==5
Out: True

In: 5.===5
Out: False

虽然它们在数值上相同,这就是为什么==返回True的原因,但它们并不完全相同。

顺便提一下,它们在内部是不同的函数。 ==Equal,而===SameQ


14

Equal 指的是语义相等,而SameQ则是指句法相等。比如,Sin[x]^2+Cos[x]^21是同一个数,因此它们在语义上是相等的。但由于这需要更多的转换才能确定,因此Equal 返回未计算的结果。然而,这些实际表达式是不同的,所以SameQ返回False

Sin[x]^2 + Cos[x]^2 == 1
Sin[x]^2 + Cos[x]^2 === 1
Simplify[Sin[x]^2 + Cos[x]^2 == 1]

请注意,Real 数字有特殊处理,SameQ[a,b] 如果 ab 在最后一位二进制数字不同,可能返回 True。如果想要进行更严格的标识测试,请使用 Order[a,b]==0

a = 1. + 2^-52;
b = 1.;
a === b
Order[a, b]==0

SameQ可以对句法不同的表达式返回True,因为表达式头可能会自动对参数进行排序。你可以使用保留属性来防止自动排序。例如:

c + d === d + c
SetAttributes[SameQ, HoldAll]
c + d === d + c

能否请您提供一个例子,说明当a和b在最后一个二进制位上不同时,SameQ [a,b]可以返回True的情况呢?谢谢! - Dr. belisarius
添加了一个示例,利用双精度浮点数的尾数有53位数字的事实。 - Yaroslav Bulatov

7

lhs===rhs 会在 lhs 和 rhs 表达式完全相同的情况下返回 True,否则返回 False。

并且

如果 lhs 和 rhs 完全相同,则 lhs==rhs 返回 True。

参考自这里这里


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接