Mathematica 中 == 和 === 之间的区别
Posted
技术标签:
【中文标题】Mathematica 中 == 和 === 之间的区别【英文标题】:Difference between == and === in Mathematica 【发布时间】:2011-07-14 06:59:21 【问题描述】:我的印象是=
是一个赋值,==
是一个数字比较,===
是一个符号比较(以及在其他一些语言中,==
是 equal to
和 @987654327 @是identical to
。但是,看下面的内容似乎不一定是这种情况......
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 中 == 和 === 之间究竟有什么区别?我一直在看文档,但我还是不太明白。
【问题讨论】:
有关Equal
和SameQ
的数值行为的更多信息,请参阅this 答案。
【参考方案1】:
一个重要的区别是===
总是返回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>]
等内容。
【讨论】:
【参考方案2】:Equal
是指语义相等,而SameQ
是语法相等。例如,Sin[x]^2+Cos[x]^2
和 1
是相同的数字,因此它们在语义上是相等的。由于没有更多转换就无法确定这一点,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
数字有特殊处理,如果 a
和 b
在最后一个二进制数字上不同,SameQ[a,b]
可以返回 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。?谢谢! 添加示例,使用 double 的尾数为 53 位这一事实【参考方案3】:我将您引导至section 2.5: Equality checks Leonid Shifrin 的一本好书。
【讨论】:
【参考方案4】:==
和 ===
非常相似,如果 lhs 和 rhs 相等,则返回 True
。它们不同的一个例子是当您比较不同表示格式的数字时。
In: 5.==5
Out: True
In: 5.===5
Out: False
虽然它们在数字上相同(这就是==
返回True
的原因),但它们并不完全相同。
仅供参考,它们在内部是不同的功能。 ==
是 Equal
,而 ===
是 SameQ
。
【讨论】:
【参考方案5】:lhs===rhs 如果 表达式 lhs 与 rhs 相同, 否则产生 False。
和
lhs==rhs 如果 lhs 和 rhs 则返回 True 是相同的。
来自here 和here 的引用。
【讨论】:
以上是关于Mathematica 中 == 和 === 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
MX 文件的快速加载跨平台替代品 (Mathematica)
Mathematica里面用Plot画图怎么只有坐标没有图像?