Difference between == and === in Mathematica

2019-02-09 01:21发布

I was under the impression that = is an assignment, == is a numeric comparison, and === is a symbolic comparison (as well as in some other languages == being equal to and === being identical to. However, looking at the following it would appear that this is not necessarily the case...

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

So what exactly is the difference between == and === in Mathematica? I have been looking at the documentation but I still don't quite understand it.

5条回答
疯言疯语
2楼-- · 2019-02-09 01:48

One important difference is that === always returns True or False. == can return unevaluated (which is why it's useful for representing equations.)

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

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

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

Out[8]= False

There are some interesting cases where == returns unevaluated that are worth being aware of while programming. For example:

In[10]:= {} == 1

Out[10]= {} == 1 

which can affect things like If[foo=={}, <true>, <false>].

查看更多
闹够了就滚
3楼-- · 2019-02-09 01:59

lhs===rhs yields True if the expression lhs is identical to rhs, and yields False otherwise.

and

lhs==rhs returns True if lhs and rhs are identical.

Reference from here and here.

查看更多
forever°为你锁心
4楼-- · 2019-02-09 02:03

I direct you to section 2.5: Equality checks of an excellent book by Leonid Shifrin.

查看更多
时光不老,我们不散
5楼-- · 2019-02-09 02:04

== and === are very similar in the sense that it returns True if the lhs and rhs are equal. One example where they differ is when you compare numbers in different representation formats.

In: 5.==5
Out: True

In: 5.===5
Out: False

Although they are the same numerically, (which is why == returns True), they aren't exactly identical.

FYI, they are different functions internally. == is Equal, whereas === is SameQ.

查看更多
男人必须洒脱
6楼-- · 2019-02-09 02:11

Equal refers to semantic equality whereas SameQ is syntactic equality. For instance, Sin[x]^2+Cos[x]^2 and 1 are the same number, so they are equal semantically. Since this can not be determined without more transformations, Equal returns unevaluated. However, actual expressions are different, so SameQ gives False.

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

Note that there's special handling of Real numbers, SameQ[a,b] can return True if a and b differ in the last binary digit. To do more restrictive identity testing, use Order[a,b]==0

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

SameQ can return True for expressions that are syntactically different because expression heads may sort arguments automatically. You can prevent automatic sorting by using holding attributes. For instance

c + d === d + c
SetAttributes[SameQ, HoldAll]
c + d === d + c
查看更多
登录 后发表回答